3D光线追踪 – 生成光线

在(i,j)点从相机眼睛射向相机屏幕的光线如何获得3D世界坐标中该点的坐标?

我能在网上find的最好的是S S = Q + au + bv

Q是相机方向,u,v是相机的UV平面。不知道如何find他们的坐标,如果我需要他们在世界坐标或其他东西。

如果你能澄清这个问题,那会很好的。

谢谢。

Solutions Collecting From Web of "3D光线追踪 – 生成光线"

您可以使用以下公式计算任何像素px,py相机光线:

 ray.origin = camera.getPosition(); relativeX = px * 2 / screenWidth - 1; // [0, screenWidth] -> [-1, 1] relativeY = py * 2 / screenHeight - 1; // [0, screenHeight] -> [-1, 1], might need to be flipped depending on the coordinate system ray.direction = vector(relativeX * sin(FOV_X / 2), relativeY * sin(FOV_Y / 2), 1); ray.direction.normalize(); camera.getOrientation().transform(ray.direction); 

这首先用身份相机创建光线,然后根据相机的方向进行变换。 如果你的相机是一个4×4matrix, camera.getPosition()应该返回matrix的第四列/行, camera.getOrientation()应该返回matrix的3×3左上部分。 如果你有ModelToViewmatrix,那么相机matrix就是相反的matrix。 如果相机matrix的3×3部分只有旋转但没有缩放,则只是matrix的转置。

更一般的方法是也反转投影matrix。 例如,顶点着色器可能正在用以下方式转换坐标:

 position = projection * worldToCamera * modelToWorld * vertexPosition; 

modelToWorldmatrix在这种情况下是不相关的,所以基本上这是一样的:

 position = projection * worldToCamera * worldPosition; 

哪些可以不被投影

 worldPosition = inverse(worldToCamera) * inverse(projection) * position; 

要么

 worldPosition = inverse(projection * worldToCamera) * position; 

如果你不使用两个不同的屏幕空间z值(例如, px,py,-1,1px,py,1,1 )的向量,你会在世界空间得到两个向量,正在找。