本次作业中,有2个函数需要修改:

其中第二个比较简单,我们先讲第二个。
按照PPT公式来实现即可。
需要注意的点是:公式中的b1 b2 (1-b1-b2)分别代表了三角形中心坐标中的α,β,γ,计算完之后,除了要验证 t 是否为正, 还要验证b1 b2 (1-b1-b2)是否在三角形内!

实现代码如下:
- // TODO: Implement this function that tests whether the triangle
- // that's specified bt v0, v1 and v2 intersects with the ray (whose
- // origin is *orig* and direction is *dir*)
- // Also don't forget to update tnear, u and v
-
- bool rayTriangleIntersect(const Vector3f& v0, const Vector3f& v1, const Vector3f& v2, const Vector3f& orig,
- const Vector3f& dir, float& tnear, float& u, float& v)
- {
- Vector3f e1 = v1 - v0;
- Vector3f e2 = v2 - v0;
- Vector3f s = orig - v0;
- Vector3f s1 = crossProduct(dir, e2);
- Vector3f s2 = crossProduct(s, e1);
-
- float dividend = dotProduct(s1, e1);
- Vector3f divisor = {
- dotProduct(s2, e2),
- dotProduct(s1, s),
- dotProduct(s2, dir)
- };
-
- Vector3f result = divisor / dividend;
-
- tnear = result.x;
- u &