Xcode 我在哪里用OpenGL点击的?
我正在用Xcode/OpenGL编程,在我的视图中显示了一些3d对象。Xcode 我在哪里用OpenGL点击的?,xcode,opengl,3d,mouse,Xcode,Opengl,3d,Mouse,我正在用Xcode/OpenGL编程,在我的视图中显示了一些3d对象。 有什么方法可以在OpenGL中检索我单击的3D位置/顶点/面吗?通常的方法是调用glunproject两次,在两种情况下使用x和y坐标,在一种情况下使用znear,在另一种情况下使用zfar 这就给出了光线经过的两点。你的鼠标点击在那条射线上 现在,使用该光线碰撞对象(首先是边界体积,然后是每个三角形(如果需要),或者参数化(如果可能)。最近的一击就是你想要的 另一种可能是读回z缓冲区值(glReadPixels)。这应该用
有什么方法可以在OpenGL中检索我单击的3D位置/顶点/面吗?通常的方法是调用
glunproject
两次,在两种情况下使用x和y坐标,在一种情况下使用znear,在另一种情况下使用zfar
这就给出了光线经过的两点。你的鼠标点击在那条射线上
现在,使用该光线碰撞对象(首先是边界体积,然后是每个三角形(如果需要),或者参数化(如果可能)。最近的一击就是你想要的
另一种可能是读回z缓冲区值(glReadPixels
)。这应该用一个像素缓冲区对象来完成,并将其分布在多个帧上(否则将在管道上造成非常严重的停顿)。这将为您提供一个三维坐标,您可以为其找到最近的对象
或者,您可以使用遮挡查询(在禁用颜色写入的情况下重绘1x1视口)获得相同的效果
最后,当然有,但这是不推荐使用的功能,所以您可能不想使用它。如果您对使用在较新的opengl版本中不推荐使用的东西感到满意,另一种方法是使用拾取缓冲区/选择模式:请参见。谢谢,让我尝试不同的可能性。你会推荐哪一个呢?第一个是首选的,因为它不会阻塞管道,并且是相对简单的数学运算。如果没有选择,我会读回z缓冲区。谢谢。我尝试过实现它,几乎成功。问题是,当我的模型被旋转和平移后,我现在不知道他的新坐标是什么,以便能够测试碰撞。有什么提示吗?谢谢坐标通过矩阵乘法进行变换(单个矩阵由多个单独的矩阵组成,见第40-41页)。您可以使用
glGet
检索GL\u MODELVIEW\u矩阵
,但效率较低,并且包含视图转换。最好先缓存MODELVIEW矩阵中模型部分的值,然后再将其发送到OpenGL或调整虚拟相机。然后你可以在任何坐标上进行矩阵乘法,将其从“模型”空间转换为“世界”空间。顺便说一句,它提供了几乎所有可能的函数,如果你没有自己的库,你可能需要以与OpenGL/GLSL兼容的方式操作矩阵/向量。