【问题标题】:Convert projection to orthogonal raycast将投影转换为正交光线投射
【发布时间】: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);

但是,我现在的问题是光线投射不适用于正交相机。问题似乎是光线投射引擎在编码时考虑了投影型相机,因此当使用正交矩阵时,它会停止运行。作为参考,下面是关于如何实现光线投射的高级描述:

  1. 获取世界空间原点向量

    • 从输入的屏幕坐标中获取标准化的屏幕坐标
    • 构建 mouseVector = (normScreenCoords.x, normScreenCoords.y, 如果“近”为 0,如果“远”为 1
    • 构建视图-投影矩阵(从相机获取视图和投影矩阵并将它们相乘)
    • 将 mouseVector 乘以视图投影矩阵的逆矩阵。
  2. 获取世界空间前向向量

    • 获取鼠标世界坐标(远)并从鼠标世界坐标(近)中减去它们
  3. 将世界空间原点和世界空间前向矢量发送到光线投射引擎,该引擎使用边界框处理将这些矢量与场景中所有可见对象进行有效比较的逻辑。

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

【问题讨论】:

  • viewProjectionMatrix = getProjectionMatrix() * getViewMatrix();

标签: c++ opengl matrix projection orthographic


【解决方案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 的正确向量,这应该无需修改即可工作。

【讨论】:

    猜你喜欢
    • 2014-07-06
    • 2016-08-09
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多