gpt4 book ai didi

c++ - 如何找到鼠标单击和 3D 网格的交集?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:28 26 4
gpt4 key购买 nike

在我的程序中,我正在加载 3D 网格以进行查看和交互。用户可以旋转和缩放 View 。我将使用旋转矩阵进行旋转并调用 multmatrix 来旋转 View ,并使用 glScalef 进行缩放。用户还可以绘制网格,这就是为什么我需要平移鼠标坐标以查看它是否与网格相交。

我读过 http://www.opengl.org/resources/faq/technical/selection.htm以及我在近平面和远平面上使用 gluUnproject 并进行减法的方法,我取得了一些成功,但只有当 gluLookAt 的位置为 (0, 0, z) 时,其中 z 可以是任何合理的数字。当我移动位置说 (0, 1, z) 时,它变得困惑并返回一个只有空白空间的交点,并且没有返回网格明显位于鼠标下方的交点。

这就是我如何从鼠标点击到场景的光线:

float hx, hy;
hx = mouse_x;
hy = mouse_y;

GLdouble m1x,m1y,m1z,m2x,m2y,m2z;
GLint viewport[4];
GLdouble projMatrix[16], mvMatrix[16];
glGetIntegerv(GL_VIEWPORT,viewport);
glGetDoublev(GL_MODELVIEW_MATRIX,mvMatrix);
glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);

//unproject to find actual coordinates
gluUnProject(hx,scrHeight-hy,2.0,mvMatrix,projMatrix,viewport,&m1x,&m1y,&m1z);
gluUnProject(hx,scrHeight-hy,10.0,mvMatrix,projMatrix,viewport,&m2x,&m2y,&m2z);

gmVector3 dir = gmVector3(m2x,m2y,m2z) - gmVector3(m1x,m1y,m1z);
dir.normalize();

gmVector3 point;
bool intersected = findIntersection(gmVector3(0,0,5), dir, point);

如果有任何不同,我正在使用 glFrustum。

findIntersection 代码真的很长,我非常有信心它可以工作,所以除非有人想看,否则我不会发布它。其要点是对网格中的每个面,找到射线与平面的交点,然后查看交点是否在面内。

我相信它与相机的位置和查看 vector 有关,但我不知道如何以及如何处理它们以便鼠标正确地点击网格。谁能帮我解决这个问题?

我还没有用 glScalef 制作旋转矩阵或任何东西,所以任何人都可以让我深入了解这个吗?例如,计算时 unproject 是否考虑了 multmatrixglScalef 调用?

非常感谢!

最佳答案

解决方案是光线追踪。你射出的光线是通过两点定义的。第一个是相机的原点,第二个是投影在场景中 View 平面(您用 glFrustum 描述的平面)上的鼠标位置。这条射线与你的模型的交点就是你的鼠标点击击中模型的点

关于c++ - 如何找到鼠标单击和 3D 网格的交集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4342795/

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