首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将投影转换为正交光线投射

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

Stack Overflow用户
提问于 2018-01-04 23:31:50
回答 1查看 433关注 0票数 1

我有一个完全实现的,工作引擎在OpenGL,支持投影相机与光线投射。最近,我实现了一个正交相机类型,在视觉上,它工作得很好。作为参考,下面是我计算正字法矩阵的方法:

代码语言:javascript
复制
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. 获取世界空间原点向量。
代码语言:javascript
复制
- Get normalized screen coordinate from input screen coordinates
- Build mouseVector = (normScreenCoords.x, normScreenCoords.y, 0 if "near" or 1 if "far"
- Build view-projection matrix (get view and projection matrices from Camera and multiply them)
- Multiply the mouseVector by the inverse of the view-projection matrix.

  1. 获取世界空间正向向量。
代码语言:javascript
复制
- Get mouse world coordinates (far) and subtract them from mouse world coordinates (near)

  1. 将世界空间起源和世界空间前向矢量发送到光线投射引擎,通过使用包围框有效地处理将这些向量与场景中的所有可见对象进行比较的逻辑。

我如何修改这个算法来处理正射相机?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-05 00:57:29

您的步骤是好的,并应与预期的工作与正交相机。计算起源和方向的方法可能有问题。

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有正确的矢量,这应该是不需要修改的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48105101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档