0

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

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

任何想法都非常感谢!:)

4

1 回答 1

2

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

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

  1. 创建与屏幕具有相同纵横比的合理 ARGB 位图。
  2. 使用此位图创建 screenquad 纹理
  3. 使用此位图创建画布
  4. 其余的发生在 onDrawFrame() 中。使用透明颜料清除画布。
  5. 使用 MVP 矩阵将所需的模型顶点转换为画布坐标。
  6. 在画布坐标处绘制所需的文本
  7. 更新纹理。

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

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

于 2015-11-10T03:39:28.063 回答