我在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);
但是,我现在的问题是光线投射不适用于正交相机。问题似乎是光线投射引擎在编码时考虑了投影型相机,因此在使用正交矩阵时它会停止运行。作为参考,这里是如何实现光线投射的高级描述:
如何修改此算法以使用正交相机?
您的步骤很好,应该使用正交相机按预期工作。计算原点和方向的方式可能存在问题。
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的正确向量,这应该没有修改。