3

我尝试使用 OpenGL ES 2.0 实现坐标拾取功能。我无法实现我在桌面版本中实现的两个版本。

版本 1 是用唯一的颜色渲染每个三角形,它代表三角形的索引,而不是用光线投射计算坐标。此版本不起作用,因为在 OpenGL ES GLSL 版本 1.0 中没有变量 GL_PrimitiveID 也无法进行按位移位。

版本 2 是将坐标渲染为浮点纹理的值,但浮点纹理在 OpenGL ES 2.0 中不可用。

有没有人知道我可以实现什么?我不想对每个三角形都进行光线投射,因为它的性能不高。

感谢您的帮助和任何想法。

4

2 回答 2

1

在使用射线投射时,无论如何测试每个基元对射线都是一个坏主意。您应该构建模型的分层表示,例如边界体积树并执行加速的光线投射测试。当然,每次模型更改时,您都必须更新此树。

返回为每个三角形呈现单独颜色的原始方法,您似乎需要分配另一个顶点属性(颜色/索引),并且您必须为每个三角形重复共享顶点。顶点数将是 3 * 三角形数,但这将解决您的问题。

于 2012-12-23T06:16:56.527 回答
1

实现坐标拾取的另一种方法是物体的射线拾取。它被认为是从 2D 屏幕坐标中选取 3D 对象的最佳方法。您不必使用对象的独特颜色渲染场景并选择颜色来确定交叉点。

在这个很棒的教程的帮助下,我已经实现了 3D 对象的拾取: http://android-raypick.blogspot.com/2012/04/first-i-want-to-state-this-is-my-first。 html

在对算法进行了一些优化(我在博客文章中发表了评论)之后,就我而言,性能不是问题。为了测试性能,我选择了一个包含 3000 多个三角形的 3D 模型,而且速度很快。在实际情况下,对于碰撞检测,您可以使用几何非常简化的模型。

于 2012-11-22T07:38:57.310 回答