您可以从gltf文件中获取明确的框架吗?

如何解决您可以从gltf文件中获取明确的框架吗?

出于调试目的,我要渲染蒙皮网格物体的骨架。但是,在glTF中,它们似乎是以非常抽象的方式定义的。就是说,没有像通过线连接的一组顶点那样的“骨架”。换句话说,这没有明确定义:

enter image description here

实际上,“骨架”实际上是节点的集合,这些节点仅指定将相关顶点的位置转换为关节位置的矩阵。

是否仍可以提取关节的位置?也许通过反转inverseBindmatrix或类似的东西?

TL; DR我有一个gltf模型,我想像在Blender中那样渲染它的骨架。

解决方法

我确定您不是在这里寻找“多数”或“有点类似”的答案,但是确实有一些复杂的因素。

我将从基本策略开始:glTF是最后一英里格式,一种GPU就绪的格式,旨在以最小的麻烦将数据泵入渲染API。因此,glTF对最终用户客户毫无意义的“艺术家资产交换”类型功能没有任何同情。在这种情况下,我们对这种哲学感到失望:骨头的长度。

骨骼的起源和方向是众所周知的。它们是glTF场景层次结构中的节点(通常是空的),实际上我们只知道当皮肤和关节列表一起出现时,它们就被视为“骨骼”,这些关节表明哪些节点实际上是骨骼。作为glTF节点意味着骨骼与父节点之间具有已知关系,形式为转换矩阵,或更可能为节点上的平移,旋转和缩放参数形式。这为您提供了骨骼的原点和方向。甚至可以将其设置为动画,就像任何glTF节点都可以应用动画一样(但仅在使用TRS时才适用,而不能与矩阵一起使用)。

但是glTF中不需要骨骼的长度。为什么不?因为为了快速渲染模型,所以需要骨骼对周围顶点的影响。这是通过JOINTS_0WEIGHTS_0访问器(顶点属性)完成的,因此每个顶点都知道哪些骨骼可以影响它,以及影响多少。骨骼的“长度”是艺术家的有用的可视化参数,但在顶点着色器中不需要使用它来计算皮肤的最终位置。给定的3D应用程序可以使用骨骼长度来帮助计算或播种顶点关节权重,但是一旦计算出这些权重,就可以对其进行手工调整和更改,并且原始骨骼长度没有意义。

inverseBindMatrix本质上保留绑定姿势。它是骨骼相对于根(而非父级)的原始静止/绑定位置的倒数。以那个手臂骨骼为例,它有一些非零的+ X位置。但是,当它以自己的静止姿势坐在那里时,它基本上不会对皮肤产生任何影响,也不应将皮肤从原来的位置拉近+ X。手臂骨骼远离模型原点的事实使其想将其他顶点拉得更远,而inverseBindMatrix可以取消该效果。因此,当骨骼处于静止状态(处于绑定姿势)时,骨骼及其inverseBindMatrix会彼此完美抵消。随着骨头开始从该姿势移开,它开始施加影响。

Blender glTF导入器的价值不菲,有些花哨的恶作剧者可以在导入glTF时尽力猜测骨头的长度。但是它也导入原始顶点权重,因此,骨骼长度仅出于艺术家的视觉利益,对皮肤没有影响。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?