小编Aud*_*Guy的帖子

了解 OpenGL 引擎的 GLTF2.0 文件的蒙皮部分

我有一个简单的混合器模型,它由三个网格组成,三个网格各控制一个网格。动画只是骨骼围绕 y 轴稍微旋转立方体并返回。中心骨骼是两个外部骨骼的父骨骼。

搅拌机截图

然后,我使用 GLTF2.0(文本版本)导出插件导出此场景,现在尝试将其导入到我新制作的 opengl 引擎(c# xamarin android)中。

由于我想完全理解GLTF2.0格式和OpenGL中的骨骼动画,所以我尝试自己实现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
    }
]
Run Code Online (Sandbox Code Playgroud)

这让我很困惑,因为所有网格体都有一个骨骼结构,而不是每个网格体有三个骨骼。我想我会收集类实例(例如 Bone.cs)中的所有骨骼,每个骨骼都有一个子骨骼列表及其父骨骼字段。然后我会在实例(Animation.cs 类)中收集动画,每个动画实例都会有一个关键帧列表,其中包含给定时间戳的旋转、缩放和平移。当动画时间戳设置为 2.5 秒时,我查找该时间戳最近的两个关键帧,并对这些关键帧插入旋转、缩放和平移。

实际问题

  • 为什么会有三款皮肤?为什么 inverseBindMatrices 绑定到皮肤而不是关节?
  • 当我从关键帧(每个骨骼)进行正确的旋转、缩放、平移时,如何计算需要传递给顶点着色器的每个骨骼的矩阵?
  • 文件中的每个骨骼节点都有自己的旋转、平移、缩放值,但没有矩阵。这是为什么?是不是少了点什么?
  • gltf 文件将骨骼(关节)引用为节点 id,但作为属性传递给着色器的权重/jointId …

c# opengl animation skinning gltf

5
推荐指数
1
解决办法
4825
查看次数

标签 统计

animation ×1

c# ×1

gltf ×1

opengl ×1

skinning ×1