在(i,j)点从相机眼睛射向相机屏幕的光线如何获得3D世界坐标中该点的坐标?
我能在网上find的最好的是S S = Q + au + bv
Q是相机方向,u,v是相机的UV平面。不知道如何find他们的坐标,如果我需要他们在世界坐标或其他东西。
如果你能澄清这个问题,那会很好的。
谢谢。
您可以使用以下公式计算任何像素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,1
和px,py,1,1
)的向量,你会在世界空间得到两个向量,正在找。