Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 我在哪里用OpenGL点击的?_Xcode_Opengl_3d_Mouse - Fatal编程技术网

Xcode 我在哪里用OpenGL点击的?

Xcode 我在哪里用OpenGL点击的?,xcode,opengl,3d,mouse,Xcode,Opengl,3d,Mouse,我正在用Xcode/OpenGL编程,在我的视图中显示了一些3d对象。 有什么方法可以在OpenGL中检索我单击的3D位置/顶点/面吗?通常的方法是调用glunproject两次,在两种情况下使用x和y坐标,在一种情况下使用znear,在另一种情况下使用zfar 这就给出了光线经过的两点。你的鼠标点击在那条射线上 现在,使用该光线碰撞对象(首先是边界体积,然后是每个三角形(如果需要),或者参数化(如果可能)。最近的一击就是你想要的 另一种可能是读回z缓冲区值(glReadPixels)。这应该用

我正在用Xcode/OpenGL编程,在我的视图中显示了一些3d对象。
有什么方法可以在OpenGL中检索我单击的3D位置/顶点/面吗?

通常的方法是调用
glunproject
两次,在两种情况下使用x和y坐标,在一种情况下使用znear,在另一种情况下使用zfar

这就给出了光线经过的两点。你的鼠标点击在那条射线上

现在,使用该光线碰撞对象(首先是边界体积,然后是每个三角形(如果需要),或者参数化(如果可能)。最近的一击就是你想要的

另一种可能是读回z缓冲区值(
glReadPixels
)。这应该用一个像素缓冲区对象来完成,并将其分布在多个帧上(否则将在管道上造成非常严重的停顿)。这将为您提供一个三维坐标,您可以为其找到最近的对象

或者,您可以使用遮挡查询(在禁用颜色写入的情况下重绘1x1视口)获得相同的效果


最后,当然有,但这是不推荐使用的功能,所以您可能不想使用它。

如果您对使用在较新的opengl版本中不推荐使用的东西感到满意,另一种方法是使用拾取缓冲区/选择模式:

请参见。谢谢,让我尝试不同的可能性。你会推荐哪一个呢?第一个是首选的,因为它不会阻塞管道,并且是相对简单的数学运算。如果没有选择,我会读回z缓冲区。谢谢。我尝试过实现它,几乎成功。问题是,当我的模型被旋转和平移后,我现在不知道他的新坐标是什么,以便能够测试碰撞。有什么提示吗?谢谢坐标通过矩阵乘法进行变换(单个矩阵由多个单独的矩阵组成,见第40-41页)。您可以使用
glGet
检索
GL\u MODELVIEW\u矩阵
,但效率较低,并且包含视图转换。最好先缓存MODELVIEW矩阵中模型部分的值,然后再将其发送到OpenGL或调整虚拟相机。然后你可以在任何坐标上进行矩阵乘法,将其从“模型”空间转换为“世界”空间。顺便说一句,它提供了几乎所有可能的函数,如果你没有自己的库,你可能需要以与OpenGL/GLSL兼容的方式操作矩阵/向量。