android - 我可以在运行 AR 活动时更新 .sfb 文件吗?
问题描述
使用 SceneForm,我正在显示一个 3D 对象,该对象是从外部存储的 SFB 文件中获取的,我需要更改其颜色。有没有办法修改文件以改变它的颜色?
材料只是颜色:
newmtl Steel__-_Satin
Kd 0.627451 0.627451 0.627451
我想避免:
- 在外部存储库中为每种颜色存储一个文件。这不仅不切实际,而且每次需要更改颜色时我都必须下载一个新文件(可能很大),这可能很乏味。
- 每次都必须存储 1 个 OBJ 和几个 MTL 文件并制作一个新的 SFB。和以前一样,我必须存储更少的数据,但颜色更新的时间会更长。
提前致谢!
解决方案
在运行时设置可渲染颜色的一种方法是更改“baseColorTint”材质参数。下面是如何将可渲染的红色着色的示例:
renderable.getMaterial().setFloat4("baseColorTint", new Color(1.0f, 0.0f, 0.0f, 1.0f));
此外,如果您想拥有多个可渲染副本,每个副本设置为不同的颜色,您可以这样做:
Renderable tintedRenderable = originalRenderable.makeCopy();
tintedRenderable.getMaterial().setFloat4("baseColorTint", new Color(1.0f, 0.0f, 0.0f, 1.0f));
请注意,这是通过将来自对象纹理的“baseColor”相乘来实现的。如果对象在着色之前是纯白色的,这将最有效。
此外,不同的 sfb 可以有不同的材料参数集。通过查看 .sfa 文件的“参数”块,您可以了解 sfb 中存在哪些材料参数。您还可以使用自己的材质参数编写自定义材质,并使用它来控制 sfb 在运行时的外观和感觉。
推荐阅读
- sql - Doctrine: 双方非 PK 属性上的多对多映射
- c++ - 从文件中读取扩展的 ascii 字符
- c# - 从.net 5 web api返回图像作为url
- pine-script - 交易视图。有没有办法用分钟的时间范围获得最后 N 天 K?
- mysql - 是否可以在加入 SQL 时聚合表?
- elasticsearch - 奇怪的内置“经典”分析器?
- c++ - 在 C++ 中将函数转换为协程的性能损失是多少?
- jquery - clearInterval 在我的 JS 代码中不起作用
- python - xlwings:如何从 VBA 调用异步 UDF,无需单元格写入且无需插件
- reactjs - 当redux reducer不返回新数组时,为什么react组件可以重新渲染?