将投影转换为正交光线投射

问题描述 投票:1回答:1

我在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. 获取世界空间原点矢量 从输入屏幕坐标获取标准化屏幕坐标 构建mouseVector =(normScreenCoords.x,normScreenCoords.y,如果“near”则为0,如果为“far”则为1 构建视图 - 投影矩阵(从Camera获取视图和投影矩阵并将它们相乘) 将mouseVector乘以视图投影矩阵的倒数。
  2. 获取世界空间前向矢量 获取鼠标世界坐标(远)并从鼠标世界坐标(近处)中减去它们
  3. 将世界空间原点和世界空间前向矢量发送到光线投射引擎,该引擎处理通过使用边界框有效地将这些矢量与场景中的所有可见对象进行比较的逻辑。

如何修改此算法以使用正交相机?

c++ opengl matrix projection orthographic
1个回答
1
投票

您的步骤很好,应该使用正交相机按预期工作。计算原点和方向的方式可能存在问题。

1.)获取原始向量。首先以世界空间单位计算鼠标位置,即float rayX = (mouseX - halfResolution) / viewport.width * (r - l)或类似物。它应该是偏移的,因此屏幕的中心是(0,0),鼠标可以到达的极值转换为视口l, r, t, b的边缘。然后从世界空间中的摄像机位置开始,添加两个向量rayX * camera.local.rightrayY * camera.local.up,其中rightup是摄像机本地坐标系统中的单位向量。

2.)世界空间前向矢量始终是任何鼠标位置的摄像机前向矢量。

3.)只要你有1和2的正确向量,这应该没有修改。

© www.soinside.com 2019 - 2024. All rights reserved.