- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的 blender 模型,它由三个网格组成,三个骨骼分别控制一个网格。动画只是骨骼围绕 y 轴旋转立方体并返回。中心骨骼是两个外部骨骼的父级。
然后我使用 GLTF2.0(文本版本)导出插件导出这个场景,现在正尝试将其导入我新制作的 opengl 引擎(c# xamarin android)。
由于想完整了解OpenGL中的GLTF2.0格式和骨骼动画,所以尝试自己实现GLTF2.0阅读。
我读了:
显示网格很容易,但现在我无法让动画正常工作。在我的 gltf 文件中,我看到三种皮肤:
"skins" : [
{
"inverseBindMatrices" : 21,
"joints" : [
4,
5,
6
],
"skeleton" : 0
},
{
"inverseBindMatrices" : 22,
"joints" : [
4,
5,
6
],
"skeleton" : 0
},
{
"inverseBindMatrices" : 23,
"joints" : [
4,
5,
6
],
"skeleton" : 0
}
]
这让我感到困惑,因为我对所有网格都有一个骨骼结构,而不是每个网格有三个骨骼。我想我会收集类实例(比如 Bone.cs)中的所有骨骼,每个骨骼都有一个子骨骼列表和一个父骨骼字段。然后我会在实例(Animation.cs 类)中收集动画,每个动画实例都会有一个关键帧列表,其中包含给定时间戳的旋转、缩放和平移。当动画时间戳设置为 2.5 秒时,我会查找该时间戳最近的两个关键帧,并为这些关键帧插入旋转、缩放和平移。
我希望你能帮助我。亲切的问候!!如果需要,我可以提供更多我的代码,但我认为,如果我从整体上理解了该主题,那么我就可以自己完成。
编辑
编辑 #2
好吧,我想我正在掌握它的窍门......慢慢地。
对于由骨架控制的每个网格,文件中都有一个皮肤。我认为每个网格都需要一个反向绑定(bind)矩阵,以便能够将网格转换为骨骼空间(并且 - 如果需要 - 返回)。
我仍然不知道如何在将最终变换传递给着色器之前正确计算它们。
这一点我仍然不明白。
由于每个皮肤都有一个包含三个(或最多 4 个)关节的列表,因此这些关节的最终变换需要传递给顶点着色器。如果您有 8 个关节,但当前要绘制的网格仅受其中 4 个的影响,为什么要传递所有 8 个矩阵而不是仅传递您需要的 4 个。
这一切仍然笼罩在疑问之中。也许这对其他人有帮助。
最佳答案
我试着一一解答你的问题
- Why are there three skins? Why is the inverseBindMatrices bound to a skin and not to a joint?
正如您已经发现的,每个网格有一个皮肤。事实上,在您的特定情况下,您可以将所有三个网格合并为一个,并没有真正限制这个一般原则。然而
I think there needs to be an inverse bind matrix for each mesh in order to be able to transform the mesh to bone space (and - if need be - back).
每个网格的每个关节都有一个逆绑定(bind)矩阵。该属性的名称是复数形式的 inverseBindMatrices
是有原因的,它引用了 bufferview
,后者又引用了 buffer
中的一些数据。
在这里更改问题的顺序,因为这样会更有意义:
Every bone node in the file has its own rotation, translation, scale values but no matrix. Why is that? Isn't there something missing?
您还需要什么?每一个仿射变换都可以分解为平移、旋转和缩放,所以数据是完整的。 glTF 规范定义生成的矩阵应按 T*R*S
的顺序计算。
- When I have the right rotation, scaling, translation from a key frame (per bone), how do I calculate the matrices for each bone that I need to pass to my vertex shader?
对于每个骨骼节点 i
,您可以计算局部变换为 M_local(i) = T(i)*R(i)*S(i)
。您将通过应用完整的层次结构来获得联合矩阵,所以基本上 M_global(i) = M_global(parent(i)) * M_local(i)
然后可以将连接矩阵构造为 M_joint (i) = inverse(globalTransform) * M_global(i) * inverseBindMatrix(i)
.
- The gltf file referse to a bone (joint) as a node id, but the weights/jointId-Arrays that get passed as attributes to the shader do not match these bone ids: jointIds-Array contains i.e. 0,1,2 for the bone ids, but the bones are in nodes 4,5,6 - how do I find the right bone for each jointId passed to the shader?
jointIds
数组包含对关节的引用,而不是骨骼(因此得名)。蒙皮着色器根本不关心骨骼,骨骼所做的只是在这里定义关节的层次结构,因此它们会影响 M_global
的实际值,因此也会影响 M_joint
矩阵。第 i
条目仅引用相应皮肤的 joints
数组中的第 i
关节,因此它需要 M_joint( i)
.
- Since every Skin has a list of three (or max. 4) Joints, these are the Joints of which the final transformations need to be passed to the vertex shader.
为什么 皮肤
被限制为 4 个关节。皮肤可以有任意多的关节。
If you have 8 Joints but the current to-be-drawn Mesh only gets affected by 4 of them, why should you pass all 8 matrices instead of only the 4 you need.
为什么要为只需要 4 根骨骼的网格定义 8 根骨骼的皮肤? glTF 数据格式不会阻止您存储不相关的信息,或以低效的方式存储信息。
这里要注意的一点是,关节之间的层级仍然由骨架
的骨骼节点层级定义。因此,您可以在单个 skin
中省略任意关节,但是这些骨骼节点(以及它们的潜在动画)仍然会影响最终的关节矩阵 - 对于由低于在骨架骨骼层次结构中“遗漏”了骨骼。
关于c# - 了解 OpenGL 引擎的 GLTF2.0 文件的蒙皮部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55989429/
以下代码: if (!(ep = engOpen("\0"))) { fprintf(stderr, "\nCan't start MATLAB engine\n");
我在谈论一些网络事物,例如 http://uservoice.com/ 你能推荐任何其他类似的服务、网站,或者可能是(甚至更好)一个现成的引擎来部署在自己的服务器上? 实际上,更多关于系统的问题,可以
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在寻找一个矩阵表达式解析器/引擎。例如, 3 * A + B * C 其中 A、B、C 是矩阵是一个典型的表达式。这应该类似于(单值)数学表达式解析器/引擎,但应该处理矩阵值和变量。我已经用谷歌搜
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Improve this qu
是否有基于 .net 的 cometd 引擎?比如 Ajax 推送引擎 那是免费和开源的吗? 最佳答案 轨道式 Orbited是一个 HTTP 守护进程,针对长期 cometd 连接进行了优化。它旨在
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在寻找支持以下功能的 haml javascript“端口”: 存储在文件中的模板。 JSON 输入。 支持“集合”[{Booking},{Booking},{Booking}] 进行迭代处理。
我在 IronPython 中托管 IronPython。我没有找到使用等效的命令行参数初始化它的方法:-X:FullFrames . 我的代码有点像这样: import clr clr.AddRef
我想将我工作的公司的所有松散信息整合到一个知识库中。 Wiki 似乎是一种可行的方法,但大部分相关信息都隐藏在 PST 文件中,并且需要很长时间才能说服人们将他们的电子邮件(包括附件)手动翻译成 Wi
我已经使用缓存的 flutter 引擎 flutter 到现有的 native 应用程序(添加到应用程序)中。 override fun onCreate(savedInstanceState: Bu
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在使用 Django Cassandra我已经定义了我的模型,我可以用它来命名一个表: class Meta: db_table = "table_name" 但是,Cassand
类似于 NoSQL 数据库,但适用于 OLAP。当然是开源的:) 编辑: OLAP 引擎在幕后使用关系数据库。例如 SAPBW 可以使用 Oracle 等。我的意思是一个没有这个底层关系数据库的 OL
我正在使用以下片段来 enable Razor templating in my solution (在 ASP.NET MVC3 之外)。是否可以轻松实现布局? 背景资料: 我在这一点上(模板编译成
我们目前使用闭源知识库解决方案,所见即所得创建文章是TinyMCE(看起来可能是修改/简化的)。 他们目前根本不允许更改它(添加插件等,除非您可以以某种方式注入(inject)插件)。 我确实拥有对
我正在评估我们的高性能电信应用程序的 BPEL 引擎,但性能似乎很差。我们评估了 Apache Ode、SunBPEL 引擎、Active BPEL 等。您知道任何更快的 BPEL 引擎实现或 C/C
Elastic / Lucene真的需要在文档中存储所有索引数据吗?您难道不就通过通过传递数据,以便Lucene may index the words into its hash table并为每个
我是 3D 游戏新手?我正在使用 Libgdx。如何计算像 Tetromino Revolution 游戏这样的透视相机的参数?请给我任何想法。 看图片:http://www.terminalstud
我是一名优秀的程序员,十分优秀!