繁体   English   中英

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

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

我已将使用Rajawali的模型(例如茶壶)导入场景。 我想使用简单的Android视图标记模型的各个部分(例如,盖子,身体,脚,手柄和壶嘴),但我不知道如何实现。 具体来说,将标签放置在正确的位置似乎具有挑战性。 想法是,当我变换模型在场景中的位置时,标签的尖端仍正确定位

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

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

我会使用screenquad,而不是视图。 这是一般的GL解决方案,也可以在iOS上使用。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM