射线与三角形相交

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

  1. 三角形能确定一个平面
  2. 使用三角形三个顶点构建两个向量 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。

重心坐标系

三元一次方程

克莱默法则解方程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天来说说射线和球的相交检测。 从图形来说 ![射线和圆相交, origin是射线起点, dir是射线的方向向量。...
    goteet阅读 7,327评论 0 4
  • Problem Formulation Ray Tracing的目标是生成一张包含场景内物体,具有真实感的图像,因...
    Manster阅读 9,028评论 4 8
  • 和立方体相交和前两个相交测试比起来略微有点难度,我们先从标准的AABB开始,了解思路之后再推到OBB的情况。 射线...
    goteet阅读 8,692评论 1 8
  • 经过初高中学习平面几何的洗礼,肯定要知道三角形的重心、外心、垂心、内心、旁心,也就是俗称的三角形的五心。 三角形只...
    百合兔子阅读 24,729评论 1 11
  • 每天对自己说的12句幸福格言: 1、活着就是一种幸福! 2、生命是一场庆祝! 3、我是被宇宙深深愛着,...
    姜月萍阅读 115评论 0 0