Search code examples
nvidiaraytracingoptix

Nvidia Optix eye space intersection points


How can I calculate eye space intersection coordinates in an OptiX program?

My research showed that only object and world coordinates are provided, but I cannot believe that there is no way to get the eye space coordinates.


Solution

  • It is possible to rotate the intersection point by the camera orientation like this:

    __device__ void worldToEye(float3& pointInOut)
    {
        const float3 Un = normalize(U);
        const float3 Vn = normalize(V);
        const float3 Wn = normalize(W);
    
        const float viewMat[3][3] = {{Un.x, Un.y, Un.z},
                                    {Vn.x, Vn.y, Vn.z},
                                    {Wn.x, Wn.y, Wn.z}};
    
        float point[3]  = {pointInOut.x, pointInOut.y, pointInOut.z};
        float result[3] = {0.0f, 0.0f, 0.0f};
    
        for (int i=0; i<3; ++i)
        {
            for (int j=0; j<3; ++j)
            {
                result[i] += viewMat[i][j] * point[j];
            }
        }
    
        pointInOut.x = result[0];
        pointInOut.z = result[1];
        pointInOut.y = result[2];
    }
    

    With the input point calculated:

    float3 hit_point = t_hit * ray.direction;
    worldToEye(hit_point);
    prd.result = hit_point;