如何识别OpenGL ES多维数据集的哪个面被触及?

时间:2012-05-25 13:25:22

标签: iphone ios opengl-es

使用OpenGL ES,我创建了一个带纹理的立方体。我现在想要使每个纹理边都可以进行打印,这样我就可以创建一个在触摸特定边时导航到不同视图的立方体。

我该如何实现?

此外,我怎么知道立方体的哪一面目前可见?

2 个答案:

答案 0 :(得分:2)

有一些不同的技术可以执行对象的选择,或者像在您的情况下,在OpenGL中执行对象的面部。

我发现光线交叉技术对你的情况有些过分,但正如cthutu所说,这是一个可行的解决方案。

无论如何,我建议的解决方案是颜色挑选技术。

当用户在屏幕上“点击”时,它包括以预定颜色渲染后备缓冲中的对象或对象的面。渲染完成在纹理中,作业是读取用户单击的像素的颜色。

获得像素的颜色后,您可以轻松确定单击了哪个对象或面。

例如,假设您有一个带有6个面的立方体,您为每个面指定一种颜色(即红色,蓝色,黄色,橙色,绿色,白色),并将指定的颜色存储在程序逻辑中的某个位置。当用户单击时,使用这些假颜色渲染立方体,读取颜色,然后在屏幕上再次使用实际颜色/纹理进行渲染。在过程结束时,您将检查像素的颜色,例如黄色,然后从中确定选择。

我希望这会有所帮助。

答案 1 :(得分:1)

一种常见的3D图形任务,用于使用鼠标的游戏中。您需要计算触摸屏幕上的X和Y位置,创建从该位置开始的光线(Z = 0)并转到Z =无穷大,然后将该光线转换为世界空间(来自相机空间)。然后使用该光线计算它首先相交的三角形。

谷歌搜索"雷三角交叉口"为此数学和算法。对于一个简单的立方体,您可以遍历所有三角形。对于更复杂的场景,您需要在空间上对三角形进行散列(使用octtrees,bsps等),以使其更高效。