问题标签 [skeletal-mesh]

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 回答
262 浏览

c# - 如何根据陀螺仪方向以编程方式统一移动3d模型的肢体?

我的手臂、腿、头部和脊椎上有许多陀螺仪(在现实生活中)。每个陀螺仪都有一个唯一的 id,我将其映射到 3d 模型上的身体部位。

每个传感器的陀螺仪数据是一个四元数。

我基本上只是想根据这些数据为我的 3d 模型制作动画。

因此,如果我将头部向右旋转,3d 模型也应该类似地旋转头部。如果我单腿站立,3d 模型也应该这样做。

当使用像 Box2d 这样的 2d 物理引擎时,这就像应用变换一样简单。在 Unity 中执行此操作的等效方法是什么?

编辑:在 Godot 中它真的很简单。

https://docs.godotengine.org/en/3.0/tutorials/3d/working_with_3d_skeletons.html

0 投票
0 回答
427 浏览

opengl - 计算骨骼动画的最终骨骼变换

我有一个简单的模型,我在搅拌机中制作了一个简单的骨架结构。这是它的外观:

图像

这是搅拌机中的层次结构:

图像

如您所见,它有两根骨头:一根在矩形框的中间(“骨头”),它是完全静止的。另一个从中间点到顶部的骨骼(“Bone.001”)旋转。

我使用 AssImpNet 导入了网格,并从动画节点通道中提取了旋转、缩放和位置键。当我将这些变换应用于网格时,我得到了这个结果(按骨骼重量着色):

图像

动作/动画似乎可以正确播放,所以我相信这部分可以正常工作。现在这是我的理解开始崩溃的地方,但我相信我缺少的关键部分是计算“反向绑定姿势”(我已经看到了一些名称),并将其应用于我的骨骼转换也输入我的着色器。但到目前为止,我还不能准确地找到我需要从 AssImp 的格式中提取的内容,并将它们相乘以获得正确的最终转换。我只找到了关于遍历节点树和从每个父节点“撤消”转换或其他内容的模糊解释。

这是我尝试过的,似乎不起作用:

然后按顺序将它们相乘。

我尝试实现这一点(现在对索引进行硬编码只是为了让事情正常运行),请注意它使用的是 C#/AssImpNet,因此命名约定与 C++/AssImp 有点不同:

GetTransformedFrame 返回一个 Matrix4,它结合了与当前时间相对应的帧的缩放、旋转和位置键,并且它自己给出了您可以在 gif 中看到的结果,其中框为红色/绿色。

所有这一切给我的是一个明显不正确的结果: 图像

所以我的问题是:我对如何计算最终骨骼转换的理解是否错误?如果是这样,正确的做法是什么?

0 投票
0 回答
301 浏览

assimp - Assimp - 如何访问与网格分开的电枢?

我正在使用 Assimp 导入动画 FBX 文件。我的问题是场景中的骨架独立于共享相同关节数据的 11 个单独的网格存在。到目前为止,我一直在遍历网格时检索骨骼数据,但在这种情况下,这不会发现完整的骨架。我能找到的所有学习材料都是这样做的。

这是文件中数据的概述。霰弹枪网格没有蒙皮到骨骼层次,而是具有被解释为骨骼的动画变换,因此它们不与手臂骨架共享任何骨骼。

如何使用 Assimp 访问完整的骨架来导入模型?

在此处输入图像描述

0 投票
1 回答
216 浏览

javascript - Three.JS - 使用相同的骨骼结构在 SkinnedMeshes 之间共享骨架

我一直在努力寻找一种方法来向现有骨架添加/移除衣服(衣服网格和身体网格应该共享骨架),但我总是得到有趣/奇怪的结果。

我期待附加到共享骨架的所有衣服都已在 Blender 上以相同的骨架导出,它们都共享相同的骨骼名称和结构,我认为这会让它变得非常简单。

我在 Native iOS SceneKit 上使用过这些相同的 3D 文件,实际上我只是做了类似的事情clothing.skeleton = body.skeleton

但正如我所说,在 Three.JS 上似乎并不那么直截了当。

我试过像

也试过:

但总是以奇怪的结果结束。我见过一些使用“ratargeting”函数的代码,但我相信这些仅在骨架骨骼名称不匹配时使用,这不是我的情况。

JSFiddle游乐场

我一直在通过 JSFiddle https://jsfiddle.net/cabada/sxv4kbnm/玩弄它,那里有一个完整的代码,我正在尝试构建这个概念。

我修复骨架绑定方式的另一个目标是能够从其他来源复制骨架动画,这样我就可以动态下载它们并将它们动态应用到我的角色中。但同样,得到奇怪的结果,动画骨骼也与目标骨骼共享相同的骨骼名称和结构以进行动画处理。

我在网上找到的与该主题相关的资源和示例

https://raw.githack.com/funwithtriangles/three.js/dev/examples/webgl_animation_sharedskeleton.html

https://rawcdn.githack.com/mrdoob/three.js/r105/examples/webgl_loader_sea3d_bvh_retarget.html

https://jsfiddle.net/satori99/pay0oqcd/

https://github.com/mrdoob/three.js/pull/16608

插图

目标是能够向身体添加/移除服装,使每个角色的所有网格都使用一个骨架(以实现良好的性能),并且能够添加/移除来自其他来源的动画。

0 投票
0 回答
665 浏览

unreal-engine4 - (虚幻引擎 4)有没有办法可以在运行时将骨架网格体姿势转换为静态网格体?

我知道有一种方法可以将骨架网格物体转换为静态网格物体,方法是右键单击它并单击转换选项。我想知道是否有办法在运行时做到这一点。我有一些只适用于静态网格的功能,如果我能获得这些功能,我可以用我的游戏做一些很酷的想法。

我的最终目标是能够获取骨骼网格的特定动画帧的快照,然后根据该动画帧中的姿势创建一个新的静态网格。

我研究了姿势快照工具,但这似乎只适用于将某个姿势应用于动画师,而不是使用该姿势创建静态网格。

0 投票
1 回答
132 浏览

animation - 逆绑定矩阵的正确映射是什么?

glTF 文件为每个皮肤定义了一个反向绑定矩阵数组和一个关节列表。

假设关节列表是:

{2,5,7,4,3,6}

如果我们移动它以使索引从 0 开始,我们得到

{0,3,5,2,1,4}

在这种情况下inverse_matrix[2]可以参考两件事之一。它可以引用数组中的第二个关节,即关节 5,也可以引用关节 2。

这个完全相同的问题适用于权重数组。

换一种方式。如果从 gltf 文件中获取数据并将缓冲区加载到着色器中。我需要弄清楚如何将着色器中的顶点索引映射到其相应的 4 个皮肤矩阵。

因此,如果joints[2] maps to (3,1,0,0)

我需要知道我是否应该在ibm[3]andibm[1]ibm[2]and处获取逆绑定矩阵ibm[3](因为 at 的joints[3]值为 2)。

我希望这不会令人困惑。

0 投票
1 回答
36 浏览

unity3d - 如何使用 IK 制作一个系统以将目标锁定到身体的不同部位?

我只是有这个想法,想学习如何实现,我想做的是,当我按下按钮角色的目标以及目标的 IK 时,例如手臂位置或他如何握住武器调整到头部,腿部或身体NPC并射击它。不同部分的不同按钮。我将如何实现它,我只需要对正确的方法一点点点头,在此先感谢

0 投票
0 回答
232 浏览

unreal-engine4 - 在 Niagara 中获取骨架网格体顶点位置

我在 Niagara 的模拟阶段有一个自定义 HLSL 节点。该节点的输入变量之一是骨架网格体类型,我想通过顶点的索引获取该骨架网格体上给定顶点的位置和法线。

换句话说,我想做GetSkinnedVertexDataWS节点的等价物,但在 HLSL 中。这可能吗?

我找不到任何关于它的文档。我试过这段代码

其中'i'是我想要的顶点的索引(来自循环),但我得到了错误:

“'GetSkinnedVertexDataWS_SystemParticleMesh_AttributePosition':无法将输出参数从 'float3' 转换为 'bool' SPH_Emitter,粒子 GPU 计算脚本”

我也尝试了一些变化无济于事。

编辑:

挑选“\UE_4.26\Engine\Plugins\FX\Niagara\Shaders\Private”中的 USH 文件,并特别查看“NiagaraDataInterfaceSkeletalMesh.ush”,看起来调用应该是GetSkinnedVertexWS而不是GetSkinnedVertexDataWS

但是,当我进行此更改时,我现在得到的错误是

/Engine/Generated/NiagaraEmitterInstance.ush(1563,3-14): Err0r X3004: undeclared identifier 'ParticleMesh' SPH_Emitter, Particle GPU Compute Script,

这对我来说毫无意义。ParticleMesh是最明确的声明 - 正如我所说,它是自定义 HLSL 节点的输入。

当它提到“NiagaraEmitterInstance.ush”时,我也不知道错误指的是什么。有一个“NiagaraEmitterInstanceShader.usf”但没有 USH 文件。

这已经浪费了整个周末,进展为零。几乎没有文档也无济于事。我必须单击发射器上的任意参数打开和关闭以显示 Niagara Log 中的错误 0.2 秒,敲击打印屏幕键并将屏幕截图粘贴到 Photoshop 中以检查错误日志,这也无济于事。是时候做出改变了。

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 投票
0 回答
19 浏览

unreal-engine4 - 如何在 UE4 中从 Oculus VR 手部获取特定法线?

我想获取 Oculus 手部骨骼网格的特定位置,以便我可以从该位置进行光线投射。我需要手上的骨骼位置,以便光线投射会从该位置出来并与触发框相交。

我已经知道如何让光线投射和跳跳箱一起工作,我的主要问题是从每只手上拉出特定位置作为光线投射的起始位置。