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

时间:2015-11-08 07:17:41

标签: android opengl-es 3d rajawali

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

Rajawali教程展示了如何将Android视图置于场景之上https://github.com/Rajawali/Rajawali/wiki/Tutorial-08-Adding-User-Interface-Elements 。我也理解如何使用转换矩阵在模型上的3D坐标 转换为屏幕上的2D坐标,但我不知道如何确定精确的3D坐标 在模型本身。使用Blender将模型导出为OBJ格式,因此我假设有一些聪明的方法可以确定 Blender中的坐标并将它们导出到单独的文件中或以某种方式将它们包含在OBJ文件中(但不是 渲染这些点,只包括它们作为元数据),但我不知道如何做到这一点。

非常感谢任何想法! :)

1 个答案:

答案 0 :(得分:1)

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

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

  1. 创建一个与屏幕具有相同宽高比的合理ARGB位图。
  2. 使用此位图创建screenquad纹理
  3. 使用此位图创建画布
  4. 其余部分发生在onDrawFrame()上。使用透明涂料清除画布。
  5. 使用MVP矩阵将所需的模型顶点转换为画布坐标。
  6. 在画布坐标处绘制所需文本
  7. 更新纹理。
    • 您的文字将在您指定的顶点处非常精确地渲染。 GL线程将双缓冲并循环回到#4。超级流畅的3D文字动画!
    • 使用双浮点数学运算来避免坐标转换过程中的精度损失,从而导致文本抖动。您甚至可以使用顶点的z值来缩放文本。花式!
    • 性能瓶颈是#7,因为每个帧必须将整个位图复制到GL纹理内存。尽量保持位图尽可能小,保持纵横比。也许让用户切换标签。

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