【发布时间】:2018-06-14 18:20:23
【问题描述】:
我在 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);
但是,我现在的问题是光线投射不适用于正交相机。问题似乎是光线投射引擎在编码时考虑了投影型相机,因此当使用正交矩阵时,它会停止运行。作为参考,下面是关于如何实现光线投射的高级描述:
-
获取世界空间原点向量
- 从输入的屏幕坐标中获取标准化的屏幕坐标
- 构建 mouseVector = (normScreenCoords.x, normScreenCoords.y, 如果“近”为 0,如果“远”为 1
- 构建视图-投影矩阵(从相机获取视图和投影矩阵并将它们相乘)
- 将 mouseVector 乘以视图投影矩阵的逆矩阵。
-
获取世界空间前向向量
- 获取鼠标世界坐标(远)并从鼠标世界坐标(近)中减去它们
-
将世界空间原点和世界空间前向矢量发送到光线投射引擎,该引擎使用边界框处理将这些矢量与场景中所有可见对象进行有效比较的逻辑。
如何修改此算法以使用正交相机?
【问题讨论】:
-
viewProjectionMatrix = getProjectionMatrix() * getViewMatrix();
标签: c++ opengl matrix projection orthographic