Source: https://www-users.cse.umn.edu/~fengqian/cg/CGTutorialProj3_doc_en.pdf