gpt4 book ai didi

c++ - 将投影转换为正交光线转换

转载 作者:行者123 更新时间:2023-11-30 05:06:05 28 4
gpt4 key购买 nike

我在 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. 获取世界空间原点 vector

    • 从输入的屏幕坐标中获取规范化的屏幕坐标
    • 构建 mouseVector = (normScreenCoords.x, normScreenCoords.y, 0 如果“近”或 1 如果“远”
    • 构建 View -投影矩阵(从Camera获取 View 和投影矩阵并相乘)
    • 将 mouseVector 乘以 View 投影矩阵的逆矩阵。
  2. 获取世界空间前向 vector

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

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

最佳答案

您的步骤没有问题,应该可以按预期使用正交相机。您计算原点和方向的方式可能有问题。

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

2.) 世界空间前向 vector 始终是任何鼠标位置的相机前向 vector 。

3.) 只要您拥有 1 和 2 的正确 vector ,这应该无需修改即可工作。

关于c++ - 将投影转换为正交光线转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105101/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com