使用 Android 和 OpenGL ES/Rajawali 标记部分 3D 模型

Labeling parts of 3D model with Android and OpenGL ES/Rajawali

我已经将使用 Rajawali 的模型(例如茶壶)导入到我的场景中。 我想要标记模型的各个部分(例如盖子、body、脚、把手和喷嘴) 使用普通 Android 视图,但我不知道如何实现。具体来说,定位 正确位置的标签似乎具有挑战性。这个想法是,当我在场景中转换模型的位置时,标签的提示仍然正确定位

Rajawali 教程展示了如何 Android 视图可以放置在场景的顶部 https://github.com/Rajawali/Rajawali/wiki/Tutorial-08-Adding-User-Interface-Elements .我还了解如何使用转换矩阵在模型上生成 3D 坐标 在屏幕上转换为 2D 坐标,但我不知道如何确定确切的 3D 坐标 在模型本身上。该模型使用 Blender 导出为 OBJ 格式,所以我假设有一些聪明的方法来确定 Blender 中的坐标并将它们导出到单独的文件或以某种方式将它们包含在 OBJ 文件中(但不是 呈现这些点,仅将它们作为元数据包括在内),但我不知道该怎么做。

非常感谢任何想法! :)

我会使用 screenquad,而不是视图。这是一个通用的 GL 解决方案,也适用于 iOS.

您必须确定所需模型顶点的索引。使用下面的文本渲染算法,您可以 fiddle 它们,直到您找到正确的。

  1. 创建与屏幕具有相同宽高比的合理 ARGB 位图。
  2. 使用此位图创建屏幕四边形纹理
  3. 使用此位图
  4. 创建canvas
  5. 剩下的发生在 onDrawFrame() 中。使用透明油漆清除 canvas。
  6. 使用 MVP 矩阵将所需的模型顶点转换为 canvas 坐标。
  7. 在 canvas 坐标处绘制所需的文本
  8. 更新纹理。

  • 您的文本将非常精确地呈现在您指定的顶点处。 GL 线程将进行双缓冲并将您循环回到#4。超级流畅的3D文字动画!
  • 使用双浮点数学运算以避免在坐标转换过程中丢失精度,从而导致文本不稳定。您甚至可以使用顶点的 z 值来缩放文本。太棒了!
  • 性能瓶颈是#7,因为必须将整个位图复制到 GL 纹理内存,每一帧。尽量保持位图尽可能小,保持纵横比。也许让用户切换标签。

  • 请注意,复制到 GL 纹理内存是多余的,因为在 OpenGL-ES 中,GL 内存只是常规内存。出于兼容性原因,保留了一块冗余的常规内存以人为地强制执行复制。