我真的是最后一招了。我已经两天没能解决这个问题了。所以,如果有人对3D、矩阵和动画有一定的了解,我会非常感激您的意见。
我已经下载了这个项目并将其实现到我的项目中:http://xbox.create.msdn.com/en-US/education/catalog/sample/skinned_model。 我的游戏角色在施法时会挥舞手臂。我已经成功地制作了这个动画并将其导入到了项目中。但我需要在他双手的掌心产生根据动画移动的粒子。我只需要在应用动画后双手掌心的3D位置。 动画期间手部图片: http://s18.postimg.org/qkaipufa1/hands.png 如果您查看样本项目中的蒙皮模型:类:AnimationPlayer.cs,您会注意到它处理矩阵3次:
我需要提醒一下,我知道手掌骨骼的索引以及它所有父级的索引:
10 - 11的父级,根骨骼
11 - 12的父级
12 - 13的父级
13 - 14的父级
14 - 15的父级
15 - 16的父级
16 - 手掌骨骼
据我所理解,这个项目中,我列出的所有GetXXXXXXXX命令都会返回一个按照骨骼索引排序的Matrix[]数组。因此,要获取Bone 10的Transform,我认为代码将如下所示:
我已经下载了这个项目并将其实现到我的项目中:http://xbox.create.msdn.com/en-US/education/catalog/sample/skinned_model。 我的游戏角色在施法时会挥舞手臂。我已经成功地制作了这个动画并将其导入到了项目中。但我需要在他双手的掌心产生根据动画移动的粒子。我只需要在应用动画后双手掌心的3D位置。 动画期间手部图片: http://s18.postimg.org/qkaipufa1/hands.png 如果您查看样本项目中的蒙皮模型:类: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的Transform,我认为代码将如下所示:
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 HandPosition = transform.Up;
当我尝试上述解决方案时,我得到了混合的结果。对于某些骨骼来说,在动画的中间部分移动是正确的。但是,实际上并没有什么好的效果。有人能解释一下这里发生了什么吗?如何获得手掌骨骼的位置?我真的很茫然。我只在两个月前学会了矩阵是什么,而且这周才开始学习带骨骼的动画。
+1
索引,但你可以尝试一下。 - Nico Schertler