【发布时间】:2014-07-19 22:21:40
【问题描述】:
我真的要求这是最后的手段。我已经2天没能解决这个问题了。因此,如果有人对 3D、矩阵和动画有所了解,我将非常感谢您的意见。
我已经下载了这个项目并将其实现到我自己的项目中:http://xbox.create.msdn.com/en-US/education/catalog/sample/skinned_model。 我游戏中的角色在施法时会移动双手。我已经成功制作了这个动画并将其导入到项目中。但我需要在他的手掌内生成粒子,这些粒子会根据动画移动。 我只需要应用动画后他手掌的 3D 位置。
动画期间手的图片: http://s18.postimg.org/qkaipufa1/hands.png
如果您查看蒙皮模型示例项目:Class: AnimationPlayer.cs,您会注意到它处理矩阵 3 次:
public void Update(TimeSpan time, bool relativeToCurrentTime,
Matrix rootTransform)
{
UpdateBoneTransforms(time, relativeToCurrentTime);
UpdateWorldTransforms(rootTransform);
UpdateSkinTransforms();
}
并允许我们在每个步骤之后访问它们:
/// Gets the current bone transform matrices, relative to their parent bones.
/// </summary>
public Matrix[] GetBoneTransforms()
{
return boneTransforms;
}
/// <summary>
/// Gets the current bone transform matrices, in absolute format.
/// </summary>
public Matrix[] GetWorldTransforms()
{
return worldTransforms;
}
/// <summary>
/// Gets the current bone transform matrices,
/// relative to the skinning bind pose.
/// </summary>
public Matrix[] GetSkinTransforms()
{
return skinTransforms;
}
我还要提一下,我知道手掌中骨头的索引和它所有父母的索引:
10 - 11 的父级,根骨
11 - 12 岁的父母
12 - 13 岁的父母
13 - 14 岁的父母
14 - 15 岁的父母
15 - 16 岁的父母
16 - 手掌中的骨头
据我了解,这个项目是我上面列出的所有 GetXXXXXXXX 命令都返回一个根据骨骼索引排序的 Matrix[] 数组。所以要得到 Bone 10 的变换。我相信代码会是这样的:
Matrix[] M = animtionplayer.GetSkinTransforms();
Matrix transform = M[10];
好的,现在我不明白的部分。 我不知道我需要使用 3 个 GetXXXXXXXXX 函数中的哪一个来获取手掌位置。
我认为着色器计算骨骼位置的方法是将它们乘以它们的每个父骨骼。所以:
Matrix[] M = animtionplayer.GetBoneTransforms();
Matrix transform = M[10];
transform = transform * M[11];
transform = transform * M[12];
transform = transform * M[13];
transform = transform * M[14];
transform = transform * M[15];
transform = transform * M[16];
//maybe apply the world position of the model?
transform = transform * MyWorld;
然后可能得到一个vector3的位置。
Vector3 HandPosition = transform.Up;
好吧,当我尝试上述解决方案时,我得到的结果好坏参半。对于某些骨骼,它会在动画的中间部分正确移动。但老实说没什么好。有人可以解释这里发生了什么吗?如何获得手掌中骨头的位置?我在这里真的很黑暗。 2 个月前我才知道矩阵是什么,这周才知道有骨骼的动画。
【问题讨论】:
-
看起来你需要第 i 个世界变换。我不太相信
+1索引,但您可以尝试一下。 -
@NicoSchertler 是的,我再次查看了该部分,我将删除 +1。 “看来你需要第i个世界变换了。” - 什么是“我”?
-
索引为 i 的变换 ;)
标签: c# animation matrix 3d xna