按照之前的尿性,我们从数学角度去解决射线与三角形相交。
- 三角形能确定一个平面
- 使用三角形三个顶点构建两个向量 Va, Vb
- Vn = Va × Vb;
- 得到平面 ( P - P0 )·Vn = 0
- 射线和平面相交,得到交点,
- 判断交点在三角形区域内
最终代码如下:
bool IntersectPlaneWithRay(const Ray& ray,
const Vector3& P0, const Vector3& pNormal,
bool dualFace, float& t0);
bool IntersectTriangleWithRay(const Ray& ray,
const Vector3& v0, const Vector3& v1, const Vector3& v2,
float& t)
{
Vector3 edgeA = v1 - v0;
Vector3 edgeB = v2 - v0;
Vector3 normal = cross(edgeA, edgeB);
//normal.Normalize();
if (!IntersectPlaneWithRay(ray, v0, normal.Normalized(), true, t))
return false;
Vector3 intersection = ray.GetOrigin() + ray.GetDirection() * t;
if (dot(normal, cross(edgeA, intersection - v0)) < 0 ||
dot(normal, cross(-edgeB, intersection - v2)) < 0 ||
dot(normal, cross(v2 - v1, intersection - v1)) < 0)
return false;
return true;
}
Möller-Trumbore 相交算法
因为三个不相等的点能确定一个平面这么一个主要因素,三角形成为了GPU渲染中的基本图元,模型Mesh数据大部分也都是基于三角形的,所以除了光线追踪之外,比如选取什么的也都会用到射线三角形相交检测。因此有很多人发明了很多有趣、快速的做法,我们接下来看看Möller-Trumbore。