在OpenGL ES中将2D鼠标坐标转换为3D空间

时间:2010-03-28 11:21:31

标签: opengl-es

我想将鼠标当前的X和Y坐标转换为我在视口中绘制的3D空间。我需要在OpenGL ES平台上执行此操作。我发现在OpenGL中实现了以下可能的解决方案,但没有一个适合我正在寻找的东西。

  1. 我找到了NeHe的教程,就是按照传统的OpenGL方式完成的。它使用gluUnProject。 http://nehe.gamedev.net/data/articles/article.asp?article=13 尽管在OpenGL ES中没有gluUnProject,但它的实现似乎很简单,可以移植回来。但在调用它之前,我们需要使用GL_DEPTH_COMPONENT调用glReadPixels,这在OpenGL ES中是不可能的。 (我在这个主题中找到的原因:http://www.khronos.org/message_boards/viewtopic.php?f=4&t=771

  2. 我想要做的是类似于拾取,除了我不想选择对象,但我想要精确的坐标,以便我可以识别当前在鼠标光标下的对象的特定部分。我在这个答案中经历了挑选教程。 https://stackoverflow.com/posts/2211312/revisions 但他们需要glRenderMode,我认为它在OpenGL ES中不存在。

  3. 如果您知道如何在OpenGL ES中解决此问题,请告知我们。

    感谢。

2 个答案:

答案 0 :(得分:3)

我认为一般的解决方案是找出点击坐标在世界空间中的位置,假设屏幕是世界上的平面(在相机的位置)。然后你拍摄垂直于飞机的光线进入你的场景。

这需要“世界空间”代码来确定光线与哪些物体相交;您提到的不适合OpenGL ES的解决方案似乎是基于图像的,即取决于渲染场景时生成的像素。

答案 1 :(得分:1)

使用OpenGL ES 2.0,您可以使用FBO并将深度值渲染到纹理。显然,这不是很便宜(只是限制glReadPixels的方式)...

此外,因为 - 据我所知 - 您想要选择对象的某些部分,您可能想要进行某种color-picking,其中对象的每个可选部分都具有独特的颜色(请注意灯塔3D教程仅显示颜色选择背后的一般概念,您的实现可能会有所不同)。您可以通过预先执行光线/边界框交叉来优化一点,并仅将相关候选渲染到用于拾取的纹理。