鼠标拣选 - 射线球体交点,边界球体位置偏离

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

我一直在OpenGL项目上研究鼠标选择器,并按照this guide将我的2D鼠标位置转换为点击时的3D矢量。

我遇到的问题是我的选择对象/网格的计算。如果我在相机的原点位置似乎工作正常,但是一旦我开始用相机移动,我计算的网格边界球就会偏离位置。我假设我需要进行某种矩阵转换来解决这个问题,但我无法弄明白。我有权访问视图矩阵,但我不确定我是否应该在计算中实现它。

A video of my problem.没有咔嗒声可能有点难以理解问题。当我能够通过单击旁边的对象选择对象时,它会在结尾处更加清晰。

我用于计算的数据:

  • 相机的位置(计算中的rayOrigin)
  • 网格及其所有顶点以及网格在世界空间中的位置。
  • 用与上述指南相同的方法计算鼠标点击的3D矢量。

我做的第一件事是重新计算所有对象顶点以适应网格在世界空间中的位置。网格的位置也应该是网格的中心(至少在我之前链接的视频中)。

vertecies[i] = vec3(worldMatrix * vec4(vertecies[i], 1));

在我的第二步中,我将每个顶点与中心位置进行比较,并计算从中心开始具有最大幅度的顶点。这个矢量长度我用作我的边界球的半径。

我对边界球射线测试的计算,rayDir是鼠标位置矢量,rayOrigin是摄像机位置:

vec3 oc = rayOrigin - center;
float doc = dot(oc , rayDir);

if (doc > 0 || (dot(doc, doc) < radiusSquared)) return false; // no hit

vec3 a = oc - doc * rayDir;
float aSquared = dot(a, a);

if (aSquared > radiusSquared) return false; // no hit

return true; // hit

我的线性代数不是最好的,所以我希望你们能帮助我,告诉我这里做错了什么。

click mouse intersection raycasting bounding
1个回答
0
投票

我一直在看这个问题,但指的是这个webpage。从开发人员的角度来看,我很难找到你的参考资料,你的数学与我的参考不一致。例如,您的第一个条件应该是:

if (doc < 0) return false;

我不打算研究你的代码,看它是否在数学上是等价的。但是,我建议你从我的参考底部的代码开始。此外,验证center是与光线位于同一坐标系中的球体的中心。

作为旁注:

当我遇到像这样的问题时,它总是帮助我在场景中画线。在这种情况下,我会将光线转换为世界空间,并且不要忘记从逆视图矩阵中提取相机眼(在世界空间中)。我更喜欢直接将它从反向中拉出来,所以我不必质疑我是否依赖过时的缓存数据。

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