我一直在OpenGL项目上使用鼠标选择器,然后按this guide将我的2D鼠标位置转换为点击时的3D矢量。
我遇到的问题是我的选择对象/网格的计算。如果我在相机的原点位置似乎工作正常,但是一旦我开始用相机移动,我计算的网格边界球就会偏离位置。我假设我需要进行某种矩阵转换来解决这个问题,但我无法弄明白。我可以访问视图矩阵,但我不确定我是否应该在计算中实现它。
A video of my problem. 没有咔嗒声可能有点难以理解问题。当我能够通过单击旁边的对象选择对象时,它会在结束时更加清晰。
我有计算的数据:
我做的第一件事就是重新计算所有对象顶点以适应网格在世界空间中的位置。网格的位置也应该是网格的中心(至少在我之前链接的视频中)。
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
我的线性代数不是最好的,所以我希望你们能帮助我,告诉我这里做错了什么。
答案 0 :(得分:0)
我一直在研究这个问题,但是请参考此webpage。从开发人员的角度来看,我很难找到您的参考文献,并且您的数学公式与我的参考文献不一致。例如,您的第一个条件应该是:
if (doc < 0) return false;
我不会研究您的代码,以查看它在数学上是否等效。但是,我建议您从参考底部的代码开始。另外,请验证center
是球体在与射线相同的坐标系中的中心。
作为旁注:
遇到此类问题时,它总是可以帮助我在场景中画线。在这种情况下,我会将射线转换为世界空间,并且不要忘记从逆视图矩阵中提取(在世界空间中)摄影机的眼睛。我更喜欢直接将其从反函数中取出,因此我不必怀疑我是否依赖于过时的缓存数据。