C ++中的Ray-triangle交集

时间:2015-01-23 14:31:35

标签: c++ geometry intersection raytracing

我已经获得了一些我需要修复的示例代码,我需要创建的一个函数将用于三角形光线跟踪。我目前已经设置了这样的代码。

/*RayHitResult is a struct that determines if the ray has reached a polygon*/
RayHitResult TriangleIntersect(Ray& ray)
{
    RayHitResult result = Ray::s_defaultHitResult;
    double t = 10000; /*This is an extreme value for testing*/
    Vector3 point;
    Vector3 edge1 = m_vertices[1] - m_vertices[0]; /*m_vertices[0], [1] and [2] are the vertices of the triangle*/
    Vector3 edge2 = m_vertices[2] - m_vertices[0];
    Vector3 t_normal = edge1.CrossProduct(edge2); /*This is the normal*/
    double d = -(m_vertices[0].DotProduct(t_normal)); /*This is the offset*/

    t = -(ray.GetRayStart().DotProduct(t_normal) + d) / (ray.GetRay().DotProduct(t_normal)); /*The variable t is what I need to calculate*/

    point = ray.GetRayStart() + ray.GetRay()*t;

    /*This statement alters the result depending on whether there was an intersection*/
    if (t > 0 && t < 10000) 
    {
        result.t = t;
        result.normal = this->m_normal;
        result.point = point;
        result.data = this;
        return result;
    }

    return result;
}

我需要计算变量“t”的值,以确定光线是否与多边形相交。但是,用于计算“t”的当前等式是不正确的,因为它不会产生指定的结果。我被告知我使用的公式是正确的,所以有人能告诉我为什么当前的“t”方程不起作用吗?

enter image description here

n是法线,d是偏移量,S是光线原点,v是光线本身。

1 个答案:

答案 0 :(得分:0)

我总是觉得从头开始推导这些方程式最简单。

三角形可以被视为原点o和2个向量u和v。

o + au + bv指定一个平面。

首先你拿你的光线k + tl,找到那条光线与那个平面相交的t值。

这似乎是你的代码块正在做的事情。

(请注意,光线与平面平行飞行的可能性非常小,不会发生碰撞;您需要优先检查代码处理潜在的div 0) < / p>

让我们称之为碰撞点。

但这项工作尚未完成。现在的任务是确定s是否在三角形内。

如果您可以将s表示为o + au + bv,那么检查a和b将为您提供答案。

如果a和b在0和1之间是BOTH,则该点在原点o和边缘a和b的平行四边形内。

此外,如果a + b < 1该点在其下方的三角形内。