1

我正在编写一个简单的光线着色器,我正在尝试用一个立方体和一些代表点的球体来制作一个骰子。球体是正确的,但立方体的边在 x、y 和 z 轴上。立方体以 0、0、0 为中心。

我检查了顶点的坐标是否正确。我假设我的光线计算是正确的,因为球体处于正确的位置。

这是射线计算的代码

Ray Image::RayThruPixel(float i, float j)
{
    float alpha = m_tanFOVx * ((j - m_halfWidth) / m_halfWidth);
    float beta = m_tanFOVy * ((m_halfHeight - i) / m_halfHeight);
    vec3 *coordFrame = m_camera.CoordFrame();
    vec3 p1 = (coordFrame[U_VEC] * alpha) + (coordFrame[V_VEC] * beta) - coordFrame[W_VEC];
    return Ray(m_camera.Eye(), p1);
}

其中 m_tanFOVx 是 tan(FOVx / 2),m_tanFOVy 是 tan(FOVy / 2) FOVx 和 FOVy 以弧度为单位。

要找到射线和三角形的交点,我的代码如下:

 bool Triangle::Intersection(Ray ray, float &fDistance)
{
    static float epsilon = 0.000001;
    bool bHit = false;
    float fMinDist(10000000);


    float divisor = glm::dot(ray.p1, normal);

    // if divisor == 0 then the ray is parallel with the triangle
    if(divisor > -epsilon && divisor < epsilon)
    {
        bHit = false;
    }
    else
    {
        float t = (glm::dot(v0, normal) - glm::dot(ray.p0, normal)) / divisor;
        if(t > 0)
        {
            vec3 P = ray.p0 + (ray.p1 * t);
            vec3 v2 = P - m_vertexA;

            v0 = m_vertexB - m_vertexA;
            v1 = m_vertexC - m_vertexA;
            normal = glm::normalize(glm::cross(v0, v1));

            d00 = glm::dot(v0, v0);
            d01 = glm::dot(v0, v1);
            d11 = glm::dot(v1, v1);
            denom = d00 * d11 - d01 * d01;

            float d20 = glm::dot(v2, v0);
            float d21 = glm::dot(v2, v1);

            float alpha = (d11 * d20 - d01 * d21) / denom;
            float beta = (d00 * d21 - d01 * d20) / denom;
            float gamma = 1.0 - alpha - beta;

            vec3 testP = alpha * m_vertexA + beta * m_vertexB + gamma * m_vertexC;
            if((alpha >= 0 ) &&
                (beta >= 0) &&
                (alpha + beta <= 1))
            {
                bHit = true;
                fDistance = t;
            }
        }
   }
    return bHit;
}
4

0 回答 0