本次作业中,有2个函数需要修改:
其中第二个比较简单,我们先讲第二个。
rayTriangleIntersect():在Triangle.hpp中
按照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 = resu