我有一个完全实现的,工作引擎在OpenGL,支持投影相机与光线投射。最近,我实现了一个正交相机类型,在视觉上,它工作得很好。作为参考,下面是我计算正字法矩阵的方法:
double l = -viewportSize.x / 2 * zoom_;
double r = -l;
double t = -viewportSize.y / 2 * zoom_;
double b = -t;
double n = getNear();
double f = getFar();
m = Matrix4x4(
2 / (r - l),
0,
0,
-(r + l) / (r - l),
0,
2 / (t - b),
0,
-(t + b) / (t - b),
0,
0,
-2 / (f - n),
-(f + n) / (f - n),
0,
0,
0,
1);然而,我现在的问题是,光线投射不适用于正交相机。问题似乎是光线投射引擎是用投影型相机编码的,因此当使用正字法矩阵代替时,它就停止工作了。作为参考,下面是对光线投射是如何实现的高级描述:
- Get normalized screen coordinate from input screen coordinates
- Build mouseVector = (normScreenCoords.x, normScreenCoords.y, 0 if "near" or 1 if "far"
- Build view-projection matrix (get view and projection matrices from Camera and multiply them)
- Multiply the mouseVector by the inverse of the view-projection matrix.
- Get mouse world coordinates (far) and subtract them from mouse world coordinates (near)
我如何修改这个算法来处理正射相机?
发布于 2018-01-05 00:57:29
您的步骤是好的,并应与预期的工作与正交相机。计算起源和方向的方法可能有问题。
1.)得到原点向量。首先计算鼠标在世界空间单位中的位置( float rayX = (mouseX - halfResolution) / viewport.width * (r - l)或类似的).它应该被偏移,所以屏幕的中心是(0,0),并且鼠标可以达到的极值可以转换到视口l, r, t, b的边缘。然后从相机在世界空间中的位置开始,添加两个矢量rayX * camera.local.right和rayY * camera.local.up,其中right和up是相机局部协调系统中的单位向量。
2.)世界空间正向矢量始终是任何鼠标位置的摄像机前向矢量。
3.)只要你对1和2有正确的矢量,这应该是不需要修改的。
https://stackoverflow.com/questions/48105101
复制相似问题