问题标签 [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 回答
1191 浏览

animation - three.js 动画:Skeleton/Skinning vs Morph

因此,在对变形和骨骼动画(从 Blender 导出)进行了一些试验后,我发现骨骼文件比变形文件小了近 10 倍。看起来显然骨骼是更好的选择,但我想知道使用它是否有缺点。

具体来说,我怀疑动画骨架而不是变形需要更多的处理。什么时候比另一个更好?如果我为 100 个模型制作动画而不是一个模型,这有关系吗?如果 skeletal 确实需要更多处理,并且我在线托管应用程序,那么带宽的减少(由于文件大小较小)是否值得在运行时进行额外的处理?

感谢您的任何意见。

0 投票
1 回答
1332 浏览

javascript - 如何计算骨骼动画中的最终骨骼矩阵?

我很难为我的骨骼找到最终的骨骼矩阵。

我知道我的绑定姿势矩阵有效,并且我知道我的变换矩阵有效,但我认为将它们相乘(我称之为复合矩阵)然后将它们乘以其父复合矩阵(然后乘以它的父父等)会给我正确的矩阵。

值得注意的是,我使用 gl-matrix.js 作为我的向量/矩阵数学库,它的矩阵数学反向工作,得到一个世界矩阵需要 PositionMatrix * RotationMatrix * ScaleMatrix,而不是相反。所以我可能把订单搞混了

我试过改变绑定姿势矩阵和骨骼变换矩阵的乘法顺序,以及最终矩阵和父矩阵的顺序,但我现在只是想不通。

无论如何要把这个问题总结在一个弓上,给定一个网格,其中每个顶点都预先转换到它的相对骨骼空间,每个骨骼绑定姿势矩阵和每帧变换矩阵的每个骨骼我将如何找到最终的骨骼矩阵?

编辑:

仍然有问题,但它可能有助于说明我现在在哪里,下面的伪代码让模型完美地进入它的绑定姿势

上面的片段正是发生的事情,无需解释矩阵函数(它的 javascript 所以它通过 mat4.copy 和 mat4.mul 等函数完成)

我想如果我做了类似的事情

我会得到最终的矩阵(我曾尝试在poseMatrices之前使用transformMatrices),但我得到的只是一个脊椎断裂且腿由内而外的模型

编辑2:

等进一步检查,空闲帧上的骨骼变换矩阵有中间 2 行倒置?奇怪,但我正在研究如果我现在把它们换回去会发生什么

0 投票
1 回答
694 浏览

c# - 带有 Assimp 的 OpenGL (GLSL) 中的骨骼动画

我正在尝试在程序中实现 GLSL 驱动的骨骼动画......而不是漂亮的 3D 动画,我创建了一个怪物:https ://i.imgur.com/dmpKg6n.gif

在尝试了几种不同的技术之后,我创造了一个不那么可怕但仍然可怕的东西

怪物

该模型是一个穿着西装的基本人,动画应该是腿摆动,而其他一切都保持静止(一个非常简单的测试动画)。所有骨骼在其原始位置的 t=0 处都有静态关键帧,以尽量减少它们每隔几秒跳出的位置。

问题......应该是相当明显的。此外,我相当确定该模型比预期的要高。

无论如何,这是我原来的顶点着色器:

这是我的新的:

骨骼处理代码既不漂亮也不短: http: //pastebin.com/A8x1GdUw

该代码和原始着色器来自http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html

新的着色器来自于随机搜索。

编辑:我现在明白了:

腿扭扭扭捏的

使用此代码: http: //pastebin.com/PvCWUdJn

现在……我做错了什么?!处理这个问题的“正确”方法是什么?有没有我应该使用的更高质量的教程来代替这个?

更新:测试应用程序的完整源代码:https ://github.com/mcmonkey4eva/skeletalanimationtest

0 投票
0 回答
170 浏览

java - 使用骨骼变换矩阵变换顶点

嘿,伙计们,最近我一直在尝试围绕 3-D 骨骼动画进行思考,我很困惑。首先,我不明白偏移用于什么以及它们是什么,其次(我不确定它是否与偏移有关)但是如果骨骼有一个变换矩阵,那么当骨骼的关节没有时它会如何工作起源。变换矩阵使用原点作为我理解的枢轴点,并且枢轴点必须是可能是或可能不是原点的关节。谢谢!

0 投票
0 回答
216 浏览

cocos2d-x - 如何将 SPRITER 工作 ( project.scml ) 与 cocos2d-x 3.3 集成?

我在名为 Spriter 的软件中制作了骨骼动画。这是相当不错的。当我保存我的项目时,它会以扩展名 - .scml 保存。

如何使用/集成该动画项目与 cocos2d-x ?

0 投票
1 回答
122 浏览

javascript - Javascript - 优化 3D 动画的节点层次结构更新

我正在使用 WebGL 进行硬件蒙皮,但是更新我的模型节点层次结构会对性能造成巨大影响。

每个节点都需要查询其当前的位置/旋转/缩放关键帧,用它们构造一个局部矩阵,如果有父节点,则将其与父节点的世界矩阵相乘。

矩阵数学本身已尽可能优化(基于 gl-matrix 的矩阵构造的特殊变体)。

尽管如此,如果我更新许多模型,每个模型都有数十个节点(有些甚至有数百个,可悲的是),这会占用浏览器的所有执行时间。

当节点实际上不需要更新时,我尝试使用脏状态,但只需检查它们的本地数据是否更改(主要是检查位置或旋转是否更改)实际上会导致与计算矩阵相同的处理量。

WebCL 本来是理想的,但自 2014 年以来这似乎无处可去。

我开始考虑在着色器中运行它,但我不能完全理解如何设计它(例如存储关键帧,它是帧->数据的映射,或者如何写回数据)。

另一种方法是将所有动画变换缓存在纹理中,但这不能很好地缩放。对于关键帧数量足够少的模型,这是可以的,但对于动画较长的模型,这会很快变成数百兆字节。这主要是因为我想不出任何存储稀疏数据的方法。如果可能的话,那么我可以存储与关键帧相同数量的变换,这不会占用大量内存(现在,我存储每一帧的变换)。当然,这需要进行矩阵插值,我不确定这有多可靠。

有没有人有任何想法?

0 投票
1 回答
467 浏览

three.js - 如何在three.js的最新版本中处理和播放骨骼动画

我知道有skinning_blending模型,但由于它具有 gui 控件(dat.gui 与所有其他threejs 示例一样),因此代码变得过于复杂,我无法获得像以前的旧threejs 那样的简单方法像这样的版本:

对于这和其他许多人一样,我得到了错误:

THREE.AnimationHandler.add() 已被弃用。

所以我要求的是一个相同的简单代码(没有任何 gui 控制),但它在最新版本中工作。此致。

0 投票
1 回答
3798 浏览

animation - Three.js 中的动画太快了

我正在使用 ColladaLoader 将我的模型和骨骼动画加载到 Three.js 中,据我所知,它似乎在做正确的动作,但由于某种原因,动画速度快得离谱。你如何控制动画的速度?

0 投票
0 回答
460 浏览

c++ - 骨架计算

我正在尝试在我的 3D Enigne (DX 11) 上实现骨骼动画。蒙皮部分工作正常,但骨矩阵转换几乎没有问题。我正在使用基于 Valve 的 SMD 并已转换为左手坐标系(YZ 交换)的自制二进制格式。所以有我的骨头到世界的代码:

正如您在下面的图片中看到的那样,计算出的骨架看起来变形了。我认为旋转计算部分有问题,可能遗漏了一些额外的转置。我试图改变矩阵乘法顺序但没有任何成功。

原始骨架(3DS MAX)

计算骨架(引擎)

0 投票
1 回答
335 浏览

opengl - Skeletal animation blending upper/lower body, global or local space

If a model is compose of two cubes, upper cube and lower cube aligned along z axis, and lower cube is parent of upper cube.

Giving two skeletal animation:

animation A: upper cube keep static, lower cube rotate-z clockwise.

animation B: upper cube keep static, lower cube keep static

skeletal animation file stored local transformations.

that is,in animation A, lower cube may have two key frames: frame 0: rotate 0 degree, frame 50: rotate 360 degree

then blend A and B by

A: upper_weight = 1 lower_weight = 0

B: upper_weight = 0 lower_weight = 1

what's the correct result?

a. both upper and lower keep static

b. upper cube rotates counterclockwise

i think they should keep static, that's blend in global space, because A's lower weight = 0, means ignore lower transformations?

but if i blend them in local space, according to the A upper cube's local rotation, it will rotate.

i google and see people saying it's better to blend local transforms, but i don't think it gives the correct result, any suggestions?