2012-05-25 66 views
2

使用OpenGL ES,我创建了一个具有纹理的立方体。我现在正在寻找使每个有纹理的一面可以打开,所以我可以创建一个立方体,导航到不同的视图触摸特定的侧面。如何识别OpenGL ES立方体的哪个面被触摸?

我该如何执行此操作?

另外,如何知道立方体的哪些侧面当前可见?

回答

1

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

谷歌搜索“射线三角交集”的数学和算法为此。对于一个简单的立方体,您可以遍历所有三角形。对于更复杂的场景,您需要在空间上散列三角形(使用八进制,bsps等)以使其更具性能。

2

有不同的技术来执行对象的选择,或者像你的情况一样,在OpenGL中执行一个对象的面部。

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

无论如何,我建议您的解决方案是采摘技巧。

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

一旦你有了像素的颜色,你可以很容易地确定哪个对象或面被点击。例如,让我说你有一个6面的立方体,你为每个面分配一种颜色(即红色,蓝色,黄色,橙色,绿色,白色),并且在你的程序逻辑的某个地方存储分配的颜色。当用户点击时,用这些假颜色渲染立方体,读取颜色,然后再用实际的颜色/纹理在屏幕上再次渲染。在过程结束时,您检查像素的颜色,例如黄色,并从那里确定选择。

我希望这有助于某种方式。

+0

如果涉及任何灯光,将会有额外的复杂性,因为如果立方体旋转,红色的阴影将会改变。但是,如果你坚持你有六个主要和次要的颜色,它应该仍然是可能的:红色,蓝色,绿色,品红色,青色,黄色。 – Cthutu

+0

实际上,在采摘框架中,通常的做法是使用不同的共享位置,不考虑照明并应用平面渲染。 –