【问题标题】:Labeling parts of 3D model with Android and OpenGL ES/Rajawali使用 Android 和 OpenGL ES/Rajawali 标记 3D 模型的部分
【发布时间】:2016-01-21 03:38:34
【问题描述】:

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

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

非常感谢任何想法! :)

【问题讨论】:

    标签: android opengl-es 3d rajawali


    【解决方案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 内存只是普通内存。出于兼容性原因,保留了一块冗余的常规内存以人为地强制执行副本。

    【讨论】:

    • 感谢 Dominik 的回答。但是,我仍然不确定如何映射坐标。至于在画布上绘图,我不确定是否可以与标签进行任何用户交互。我想使用视图,因为我需要标签来响应点击事件。
    • 使用材质类提供的MVPMatrix(模型-视图-投影)将3d转换为屏幕坐标。由于 onTouch 事件提供屏幕坐标,因此您不需要任何视图。视图在单独的 UI 线程上处理,将 UI 线程同步到 GL 线程是非常有问题的。只需使用 GL 线程。
    • 顺便说一句,您还可以使用带有 VBO、FBO 和纹理 altas 支持的 GL_POINTS 粒子系统,以非常快速地渲染标签。请注意,纯 GL 解决方案可移植到 iOS、Win10、WebGL 等
    • 好的,谢谢!与此同时,我制定了 UI 线程解决方案,它实际上就像我的 HTC One 上的一个魅力。为什么你说同步这些线程是非常有问题的?
    • 在任何独立同步的线程之间共享数据是有问题的。如果您从不打算在 UI 和 GL 线程之间共享任何数据,那么没有问题。此外,您会注意到您的 UI 标签与 GL 顶点并不完全同步(由于独立同步,它们会非常轻微地摆动)。一个小细节,但一旦你看到完美的 GL 同步,你就不能回去了。
    猜你喜欢
    • 2012-05-01
    • 2012-03-26
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多