射线与三角形相交

2015-08-27  本文已影响919人  goteet

按照之前的尿性,我们从数学角度去解决射线与三角形相交。

  1. 三角形能确定一个平面
  2. 使用三角形三个顶点构建两个向量 Va, Vb

最终代码如下:

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。

重心坐标系

三元一次方程

克莱默法则解方程

上一篇下一篇

猜你喜欢

热点阅读