问题标签 [skeletal-animation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
61 浏览

c++ - 骨骼动画倾斜

我关注了 Thin Matrix 上关于骨骼动画的流行教程和 GitHub 上的另一个代码示例

网格渲染找到没有任何动画。但是一旦应用动画,它就会被扭曲。

如果我将身份矩阵作为骨骼变换传递,它就可以工作。就像它一样工作,它仍然可以正确渲染,只是没有任何动画。

我还注意到我使用的 collada 文件使用 Z 作为 up,我使用 Y 作为 up。但是我导出所有数据而不做任何更改,以确保所有转换和顶点数据都按预期工作。后来我计划在导出时调整它,以便数据也使用 Y。

这是我的骨骼动画代码:

标题:

来源:

我多次逐行阅读我的代码,看看我做错了什么,但我什么都想不出来。我不认为我的着色器是问题,但这里是顶点着色器:

结果: 歪斜的图像

0 投票
1 回答
101 浏览

c# - 骨骼蒙皮算法将模型脚下的所有东西聚集在一起

我正在尝试使用存储在 Collada 文件中的骨骼动画来实现蒙皮,虽然我设法加载它并在没有正确蒙皮的情况下渲染模型,但我无法弄清楚为什么当我应用我的蒙皮算法时,所有部分都会聚集在一起在模特的脚下,或极度变形。整个项目存储在GitHub 上以供参考(皮肤分支)。

我相信顶点着色器是正确的,因为如果我将身份变换传递给骨骼,我会得到我的默认姿势模型,它会根据.dae文件中以某种方式损坏的骨骼动画来计算骨骼变换。这是我的问题的样子,而不是模型在默认姿势下的样子:

带剥皮 不剥皮

我相信我的问题出在应用递归骨骼变换的某个地方:

或者在使用它们的变换构建骨骼数据的递归结构时:

相信骨骼到顶点的权重被正确地收集并上传到着色器,并且最终的骨骼阵列制服被正确地上传(但可能没有正确计算)。我也不确定矩阵乘法的顺序以及在上传到着色器时是否要转置任何东西,尽管我每次尝试都尝试过两种方式。

0 投票
1 回答
123 浏览

gltf - 了解 glTF 联合矩阵

我阅读了 glTF 的 github教程中的 Skins 部分,但无法理解其jointMatrix工作原理。

在教程中,它被定义为

我对globalTransform和取消感到困惑。在我看来,jointMatrix是这样的

在顶点着色器中

我的问题是

  • 为什么jointMatrix这样定义?
  • 我的版本有什么问题?
0 投票
1 回答
211 浏览

3d - 皮肤矩阵中 glTF 的 Inverse(GlobalTransform) 的含义

我想用骨骼动画渲染一个网格。在制作动画之前,我只想用动画的第一个关键帧渲染网格,即渲染网格与骨骼层次变换到位。我忽略了 glTF 中的场景结构;我只是meshes[0]用来获取网格并skins[0]获取它的骨架。

我知道最终的skin矩阵,作为制服馈送到顶点着色器,是计算出来的

当我这样做时,我看到我的模型在地面以下 11.4 (5.7 + 5.7) 个单位(平面在 Z = 0;世界有 +Z 向上)。当我只渲染没有任何蒙皮的网格时,即只有位置、法线和纹理坐标,它位于地面上。我还能够推断为什么在剥皮时会发生这种情况。

这是相关部分gltf

我已经阅读了 glTF 的文档教程参考指南 (PDF)。虽然文档根本没有谈到它,但教程和参考指南不得不说inverse(global_xform)

顶点必须使用网格附加到的节点的全局变换的进行变换,因为该变换已经使用模型-视图-矩阵完成,因此必须从蒙皮计算中取消。

据此,必须反转和使用Body全局变换。这导致translateZ(-5.7). 根已经有一个局部变换translateZ(-5.7),所以我理解网格到地面的 -11.4 偏移量。但是,如果我Body按原样使用 's 全局变换,没有反转,则在上述公式中没有问题。

为什么参考指南要求我们反转根骨骼父级的全局变换?我错过了什么?当我从 Blender 导入这个模型时,我注意到骨架对象上的变换确实是translateZ(5.7).

0 投票
2 回答
231 浏览

fbx - DirectX 12 中 Assimp 的骨骼动画错误

我正在使用 Assimp 将带有动画的 FBX 模型(在 Blender 中创建)加载到我的 DirectX 12 游戏中,但是我遇到了游戏应用程序渲染的动画的一个非常令人沮丧的错误。

测试模型是一个简单的“旗杆”,包含四个骨骼,如下所示:

骨骼0 -> 骨骼1 -> 骨骼2 -> 骨骼3

当绕过关键帧动画时,模型在其静止姿势中正确渲染。

当动画仅通过根骨骼 (Bone0) 旋转模型时,模型也会正确渲染和动画。

但是,当导入在第一个关节(即 Bone1)处旋转的模型时,聚集在每个关节周围的顶点似乎“卡在”其原始位置,而“骨骼”周围的顶点似乎会跟随正确的动画.

结果是拉伸几何的蹩脚之字形,如下所示:

在此处输入图像描述

相反,该模型在其动画姿势结束时应类似于“六角扳手”形状,如 AssimpViewer 实用工具中呈现的相同模型所示:

在此处输入图像描述

由于模型在 AssimpViewer 中正确渲染,因此可以合理地假设 Blender 导出的 FBX 文件没有问题。然后我检查并确认“卡在”关节周围的顶点确实确实由游戏加载代码正确分配了它们的顶点权重。C++ 模型加载和动画代码基于流行的 OGLDev 教程:https ://ogldev.org/www/tutorial38/tutorial38.html

现在令人生气的是,由于 AssimpViewer 工具正确地渲染了模型动画,我还从该工具中复制了 SceneAnimator 和 AnimEvaluator 类,以通过该代码分支生成最终的骨骼变换......只是最终得到完全游戏中同样的曲折错误!

我有理由相信在初始化时找到骨骼层次结构没有任何问题,所以这里是遍历层次结构并在每帧插入关键帧的关键函数。

我刚刚在这里包含了旋转插值,因为缩放和平移函数是相同的。对于那些不知道的人,Assimp 的 aiMatrix4x4 类型遵循列向量数学约定,所以我没有弄乱原始矩阵乘法顺序。

关于我的代码和我采用的两个基于 Assimp 的代码分支之间的唯一偏差是要求使用此转换函数将最终转换从 aiMatrix4x4 类型转换为 DirectXTK SimpleMath 矩阵(实际上是 XMMATRIX):

由于 aiMatrix4x4 Assimp 矩阵的列向量方向,最终的骨骼变换不会转置以用于 HLSL 消耗。最终骨骼变换数组被传递到蒙皮顶点着色器常量缓冲区,如下所示。

请注意,我正在使用上述代码中 DirectXTK12 库中的图形资源内存管理帮助器对象。最后,这是我正在使用的蒙皮顶点着色器。

我在发布之前尝试的最后一些测试:

我使用从 Blender 导出的 Collada (DAE) 模型测试了代码,只是在 Win32 桌面应用程序中观察到相同的扭曲曲折。

我还确认加载模型的 aiScene 对象返回全局根变换的单位矩阵(也在 AssimpViewer 中验证)。

我已经盯着这段代码大约一个星期了,我快疯了!真的希望有人能发现我错过的东西。如果您需要更多代码或信息,请询问!

0 投票
1 回答
88 浏览

c++ - 骨骼围绕父级旋转 - OpenGL 动画/蒙皮

我的骨骼蒙皮存在问题,我的骨骼不是围绕它们的本地原点旋转,而是围绕它们的父节点旋转。左 - 我的引擎。右 - 搅拌机

我怀疑管道中有两个位置有问题,但我不知道它到底在哪里。首先,我有一段代码可以实际计算骨骼矩阵:

boneOverrides 来自任何想要覆盖骨骼的东西(例如动画)。finalTransforms 是推送到着色器的数组。

在我的网格/动画解析器中,我有计算反向绑定姿势矩阵的代码(使用 OpenFBX,但这不相关):

getLocalXX 函数在本地空间中获取项目。

以及上面引用的 GetMatFromVecs 函数:

请注意,我先旋转,然后平移(顺便说一下,第一个片段中引用的 GetMatrix() 函数也是如此)。

所以我的问题是,为什么会这样?此外,在网格蒙皮中这种类型的事情的一些原因是什么?我的翻译是本地的,但轮换不是。

0 投票
1 回答
283 浏览

c++ - 如何正确混合 OpenGL 中从步行动画到跑步动画的骨骼动画?

我从 learnopengl.com(链接)完成了骨骼动画教程。

当我播放另一个动画时,它会以非常不和谐的方式“跳转”到该动画的第一帧,而不是平滑过渡到它。

这是我到目前为止写的:

下一个函数每帧运行:

其中包含:

这就是它的样子:https ://imgur.com/a/pcxDhut

当“混合因子”为 0.0 和 1.0 时,奔跑和行走动画看起来非常好,但介于两者之间的任何东西都有一种不连续性......有整毫秒看起来他在同时抬起双脚奔跑. 我怎样才能让它们正确混合?我期待看到步行和跑步之间的平稳过渡,就像在大多数第三人称游戏中逐渐移动控制器上的模拟摇杆时一样。

动画来自 mixamo.com(与模型相同),采用 FBX 格式,使用 Assimp 5.1.0rc1 加载。我在虚幻引擎 4 中使用混合空间对它们进行了测试,它们之间的“交叉淡入淡出”看起来很棒。所以不是动画文件本身,它们是正确的。

0 投票
0 回答
20 浏览

unity3d - Rotating part of animated rigged model (Unity engine)

So In my game, I change my point of view from a third-person view to a first-person view. My player is a rigged model (with skeleton) and animation is being played all the time. When I go into the first-person view I want only the upper part of the body to be able to rotate up and down.

I tried it but it was like the body parts were locked in place, so I tried using "Apply Root Motion" on the animator, but nothing. The only thing that moves is the gun that isn't rigged.

First person view image
Does anyone have a solution to this problem?

0 投票
1 回答
25 浏览

c++ - 使用多个着色器写入帧缓冲区

我目前正在我的延迟渲染管道中实现骨骼动画。由于绑定网格中的每个顶点至少需要额外的 32 个字节(由于骨骼的顶点 ID 和权重),我认为制作一个负责绘制动画网格的不同着色器是个好主意。

话虽如此,我有一个简单的几何缓冲区(帧缓冲区),它有 4 个颜色附件。这些颜色附件将使用我的静态几何着色器写入。C++ 代码如下所示:

上面的代码正常运行。问题是当我尝试将我的动画着色器添加到混合中时。以下代码是我目前使用的:

上面的例子和上一个例子一样,只是在绘制静态几何体之后绑定了另一个着色器,它尝试绘制动画几何体。请记住,静态几何着色器和动画几何着色器完全相同(除了基于骨骼变换变换顶点的动画顶点着色器)。

此代码的结果是正在绘制我的动画网格,不仅针对当前帧,还针对所有之前的帧。结果看起来像这样:https ://gyazo.com/fef2faccbfd03377c0ffab3f9a8cb8ec

编写此代码时,我最初的想法是使用动画着色器绘制的内容只会覆盖以前的数据(假设深度较低),因为我没有清除深度或颜色缓冲区。这显然不是这样的。

如果有人知道如何解决这个问题,那就太好了!