我在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);
然而,我现在的问题是光线投射不适用于正交相机。问题似乎是光线投射引擎在编写时考虑了投影型相机,因此在使用正交矩阵时它会停止运行。作为参考,这里有关于如何实现光线投射的高级描述:
获取世界空间原点向量
获取世界空间前向载体
将世界空间原点和世界空间前向矢量发送到光线投射引擎,该引擎处理通过使用边界框将这些矢量有效地与场景中的所有可见对象进行比较的逻辑。
< / LI> 醇>如何修改此算法以使用正交相机?
答案 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的正确向量,这应该不加修改。