问题标签 [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 投票
3 回答
10080 浏览

javascript - Three.js - 蒙皮骨架网格实例、动画和混合

我正在开发一款小型多人游戏,它有一个单皮肤玩家网格,许多玩家都在使用它。一些背景:我尝试通过 maya 和 blender collada 导出加载。两者似乎都引用了某种形式的动画数据,但我无法让它工作。我试过 Maya JSON 导出器,它只用一条材料线吐出微小的 1k 文件。最后,搅拌机 JSON 导出器工作了。对于那些也尝试加载蒙皮网格的人,我发现这非常有用:Model with bone Animation (blender export) animating wrongly in three.js

所以现在我有一个来自 JSON 加载器的geometry对象和一个数组。materials

我可以设置skinning=true材料,创建一个THREE.SkinnedMesh,将其添加到场景中,通过添加动画THREE.AnimationHandler.add我不清楚AnimationHandler实际做了什么),创建一个THREE.Animation,调用play()update(dt)。最后,我的场景中播放了一个网格和一个动画。

现在我想要的是这些...

  1. 许多实例- 我希望在我的场景中运行不止一个玩家模型。

    • 我不希望多次加载相同的网格和动画数据。
    • 动画时间应该是每个实例的(所以它们不会同步动画)。

    我应该为同一个模型创建很多THREE.SkinnedMeshTHREE.Animation?从哪里THREE.AnimationHandler进来?

  2. 许多动画- 我希望能够单独播放空闲/运行周期。

    AFAIK 只有一个动画关键帧时间线。Three.js 如何为我进行分区,还是我必须手动进行?

  3. 动画混合- 当一个角色停止运行并静止不动并带有空闲动画时,我不想要从一个到另一个的瞬间捕捉。我想暂停运行动画并将该状态混合回空闲动画。

    目前这对于蒙皮网格(不是变形目标)是否可行?是否有关于此的示例或文档?

任何信息都将不胜感激,即使只是朝着正确的方向轻推。我不是在完整的教程之后,我想要一些关于这些特性的更高层次的信息。

我可以愉快地实现23,但我想要一些关于threejs 皮肤和动画框架的信息/描述性文档来帮助我入门。例如,没什么好做的。

[编辑]
谢谢@NishchitDhanani,这个页面非常好,但没有提到多个动画或混合骨骼动画:http ://chimera.labs.oreilly.com/books/1234000000802/ch05.html#animating_characters_with_skinning

这个页面说多个动画仍然是一个当前的问题,但不多(在评论中讨论了一点): http ://devmatrix.wordpress.com/2013/02/27/creating-skeletal-animation-in-blender-and -将它导出到三个 js/

目前的答案是...

  1. 用了很多THREE.SkinnedMesh还是不确定THREE.AnimationHandler
  2. 不知道。也许有一种方法可以在THREE.Animation.
  3. 未实施 AFAIK。我可能会尝试创建一个自定义着色器,它可以采用两个THREE.Animations 并在它们之间进行插值。
0 投票
1 回答
370 浏览

animation - Windows 问题上的 WebGL ThreeJs 骨骼动画

我在一个项目中使用three.js(版本 61)和 WebGL 渲染器来制作带有 Kinect 检测到的数据的实时动画。
我使用了THREE.SkinnedMesh对象来创建一个支持骨骼动画的 3D 模型。

我在这些场景中测试了实时骨骼动画:

  • 在 Windows 7 上测试 1
  • 在 Mac OS X 10.9 上测试 2

...我有这个结果:
https ://docs.google.com/file/d/0B6yEkHWd_4nEVkJ4RzZuMENmZUE/edit?pli=1

在 Windows 上,问题是某些顶点的最终位置没有很好地计算!

我使用了这些浏览器:

  • 谷歌浏览器版本 31.0.1650.63
  • 火狐 26.0。

...结果是一样的。

是处理不同的 GPU 驱动程序和 WebGL 的问题吗?
我对这个主题没有很好的了解。

在 Windows 系统上使用 THREE.SkinnedMesh 对象执行动画时,有没有人遇到并解决过类似的问题?


测试场景的 注意事项
- 我有一个 Kinect 的模拟:Web 应用程序从本地运行的服务器接收数据。
- 我已将装配模型从 Blender 导出到 three.js,并且蒙皮网格的所有参数都很好地导出(如第二次测试所示)。

0 投票
1 回答
793 浏览

c++ - Assimp 没有从 OpenGL 中的 MD5 模型 Bob 的节点中加载骨骼名称

我目前正在加载一个 MD5 模型,用于使用 ASSIMP 测试动画(来自以下教程:http ://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html )。到目前为止,一切似乎都加载得很好(静态模型渲染得很好),但由于某种原因,Assimp 中的节点不显示骨骼名称。每个节点的名称是<MD5_Root><MD5_Mesh>不是它应该显示的任何骨骼名称。

以下是代码片段,它使用节点名称检查 ASSIMP 中的所有骨骼名称。永远不会到达字符串变成"HOI". nodeName 应该成为像“pubis”或“upperarm.L”这样的骨骼名称。

此外,还有一段 .MD5 文件,它可能会显示一些有用的信息。

由于某种原因,它没有正确加载名称,或者它可能是 MD5 文件本身的错误?

0 投票
0 回答
850 浏览

c++ - 计算 bindPose 矩阵(骨骼动画)

我成功地解析了 iqe(Inter Quake Exporter)格式,现在我坚持在 bindpose 中显示它。

所有顶点都有一个奇怪的变换,其中根骨骼(覆盖整个网格以进行定向)不是唯一对该顶点有影响的骨骼。您可以在网格的手臂/应该/颈部区域看到它。该网格有 3 个骨骼。一个根骨覆盖整个网格和两个臂骨。您可以看到网格在背景中的样子(导出为 obj) 在此处输入图像描述

为了更好地理解,我有以下系统:

1.我将所有顶点数据加载到一个大vbo(顶点,uvs,法线,切线,双切线,boneIndicies(4)(关节列表的索引)和boneWeights(4))

2.我将所有关节添加到关节列表中并创建一个树系统(具有位置、旋转和父指针的简单链表)

3.我有一个名为boneMatrices 的单独列表,我在其中存储......以及我的骨骼矩阵。目前每一帧,稍后我将预先计算每个动画帧的矩阵。

我尝试通过以下方式计算骨骼矩阵:

我将joint->invBindPose的转置(否则网格倒置)存储在boneMatrices中并将其发送到着色器:

boneMatrix 是 matrix4 的 std::vector

根骨绑定计算必须是正确的(至少我认为),因为头部在正确的位置,眼睛也在正确的位置(目前没有骨骼影响)

0 投票
1 回答
528 浏览

3d - Collada .DAE 的哪些节点与游戏对象和角色使用最相关?

我正在寻找一种可以从 3D 建模软件转换为我内部使用的格式的中间格式。Collada.DAE似乎很好,因为它也可以导出动画并且它是 XML。有点臃肿但易于解析。

在成为一名游戏开发者之前,我的专长是可重用代码编写、库、API 等。所以我的第一个冲动是去实现一个 Collada 格式的完整解析器,因为我不是 100% 我需要或需要从中提取的东西。

看起来 Collada 试图成为一切和厨房水槽,那里肯定有我认为我不需要担心的东西。所以,理智占了上风,决定来这里问问有经验的人,文件中游戏角色和对象的重要节点是.DAE什么?或者有没有其他被游戏开发者认为更友好的格式也可以导出动画?

发现以下几点很重要

  • 几何图形(网格 + 三角形)
  • 材料+图像
  • 动画+控制器
  • 视觉场景+场景

顶级节点列表中我还缺少什么?我认为这并不/lights重要,因为我在代码中处理它。我只需要导入网格+纹理+动画。至少现在,因为我刚刚开始从事 D3D 编程。

对于非动画对象,我可以使用文件逃脱,.OBJ但对于带有动画的角色,我真的不认为.OBJ支持它们。

那么问题来了:哪些 DAE 节点与游戏对象和动画角色相关?...如果有人使用这种格式可以提供一些描述它们的词,以一种对游戏更友好的方式,那么该规范......会很棒!或者我应该使用另一种中间格式但是.DAE

PS由于我现在正处于学习狂潮中,我对使用外部工具不感兴趣。我将编写自己的解析器、导出器、格式……一切。:)

0 投票
0 回答
924 浏览

c++ - 组合矩阵(C++ 中的骨骼动画与 Collada 文件中的 DirectX 11)

我需要结合多个矩阵在 C++ 中做骨骼动画。

我已经得到了以下矩阵:

  1. 从 COLLADA 文件绑定形状矩阵。
  2. COLLADA 文件中每个骨骼的骨骼矩阵。
  3. 为 COLLADA 文件中的每个骨骼绑定姿势矩阵。
  4. 计算每个骨骼的反向绑定姿势矩阵。
  5. 来自 COLLADA 文件的动画的每个骨骼的每一帧的帧矩阵。

我们称这些矩阵为:

  1. bindShapeTrans (XMFloat4X4)
  2. localBoneTrans(XMFloat4X4 的向量)
  3. bindPoses(XMFloat4X4 的向量)
  4. invBindPoses(XMFloat4X4 的向量)
  5. 动画(XMFloat4X4 向量的向量)

现在我必须从这些矩阵中创建一个矩阵数组以传递给我的顶点着色器,它使用它来计算考虑到它们的权重的顶点的最终位置。

在这里我迷路了。我已经阅读了很多教程,但是它们都对组合矩阵的顺序提出了不同的看法。他们还为矩阵使用不同的名称,现在我完全糊涂了。

那么,我该如何组合这些矩阵以获得正确的最终矩阵呢?

谢谢您的帮助。

0 投票
1 回答
833 浏览

c++ - 如何在顶点着色器中传递骨架权重?

我制作了一个 c++ collada 阅读器,但我使用 opengl 直接模式在 4 毫秒内绘制了一个 3K 动画网格。那太慢了。

所以我决定使用顶点着色器。在骨架中,每个顶点对每个骨骼都有一个权重(零或更多)。对于具有 40 个骨骼的 3K 网格,整个对象有 120 000 个权重。

唯一的问题是在 GLSL 中你不能声明大尺寸的统一数组。

例如,这将编译(顶点着色器):

////////////////////////////////////

/// 但不是这个:

///////////////////////////////////

我在一些页面中看到我可以使用 glVertexAttribPointer() 来设置每个顶点的属性。如果我有 1 到 4 个骨骼(我可以使用 vecX 属性),这将完成,但 GLSL(在我的情况下为 1.20)不接受属性数组。

0 投票
1 回答
1169 浏览

opengl - Assimp Skeletal Animation : Bones associated with a Vertex

I am trying to integrate the Assimp skeletal animation. Following this tutorial for reference.
The change I am trying is to use fixed function pipeline.

Problem: Position, Texture Coordinates and Normal Data is fine, but I cannot figure out how the four bones and the weight data is obtained for each vertex as mentioned in the tutorial.
Vertex Data

0 投票
1 回答
1793 浏览

kinect - 以编程方式在 3D 模型中插入骨架

背景


我正在开发一个用户被 Kinect (v2) 扫描的项目。结果将是生成的适合在游戏中使用的 3D 模型。

扫描方面进展顺利,我已经生成了一些很好的用户模型。
示例: 用户的 3D 模型 注意:这只是一个早期的测试模型。它仍然需要清理,并且需要更改姿态以正确读取骨骼数据。


问题


我目前面临的问题是我不确定如何将骨骼数据放入生成的 3D 模型中。我似乎找不到可以让我以编程方式将骨架插入 3D 模型的程序。我想通过我可以以编程方式控制的程序来执行此操作,或者以使骨骼数据包含在文件中的方式调整 3D 模型文件。


我试过什么


我一直在 Google 和 StackOverflow 上寻找类似的问题,但它们通常指的是动作捕捉或骨骼动画。我知道 Maya 可以选择在 3D 模型中插入骨架,但据我所知,这始终是手工完成的。对于我要解决的问题,也许有一个更专业的术语,但我不知道。

关于如何实现骨架插入,我确实有一个思路。我想象它是这样的:

  1. 扫描用户并使用 Kinect 生成 3D 模型;

    1.2. 清理用户模型,消除任何变形或不必要的信息。关闭清理过程中留下的孔。

  2. 使用 Kinect 扫描用户骨骼数据。

    2.2. 提取骨架数据。
    2.3. 获取关节位置并存储为 3D 空间的 xyz 坐标。存储骨骼长度和方向。

  3. 在可以创建骨架的程序中读取 3D 骨架数据。

  4. 保存带有插入骨架的新模型。


问题


任何人都可以推荐(我知道,这可能是“基于意见”)一个程序来读取骨骼数据并将其插入到 3D 模型中吗?是否可以为此目的使用 Maya?

提前致谢。

注意:我选择在这里而不是在 Graphics Design Stack Exchange(或其他 Stack Exchange 站点)上发布问题,因为我觉得它与编码更相关,也许对将来会在这里搜索的人更有用。抱歉,如果它发布在错误的网站上。

0 投票
1 回答
1603 浏览

c++ - Assimp 骨骼动画变换矩阵问题

我正在尝试使用 Assimp(开放资产导入库)制作骨骼动画。现在我可以成功地加载一个 .dae 模型并用动画渲染它,但在这样做的过程中,模型变得混乱了。

http://i.imgur.com/O7YzK8o.png

左侧模型未正确装配和加载。右边的模型被操纵并从动画中采取了正确的姿势,但奇怪地扭曲了(扁平棒图~)。

我的看法是,我可能通过骨骼矩阵乘法做错了什么。

最终矩阵(我们称它们为 M)计算如下:

其中offset_matrix[i]是来自 的串联的组合偏移矩阵aiBone->mOffsetMatrix,并且transform_matrix[i]是来自aiNodeAnimTRS 的矩阵串联的组合变换矩阵。

从底部到根部分别进行连接。

loadRelativeOffset(node, scene)将循环scene->mMeshes[0]->mNumBones并返回匹配的矩阵aiBone。如果没有找到骨骼,则返回单位矩阵。因此,最终结果将是所有骨骼矩阵的串联,忽略Armature根节点

加载变换矩阵以类似的方式完成,但使用aiNodeAniminmNumChannels而不是aiBonesin mNumBones

我想最终结果看起来像这样:

我不知道为什么 RootNode 矩阵存在,但如果它不存在,那么一切看起来都是无稽之谈。

知道是什么原因造成的,或者我能做什么?