我真的是作为最后的手段来问这个问题。我已经两天没能解决这个问题了。因此,如果有人对3D,矩阵和动画了解一两件事,我会非常感谢你的投入。
我已经下载了这个项目并将其实现到我自己的项目:model中。我游戏中的角色施展法术时会移动双手。我已经成功地制作了这个动画并将它导入到项目中。但我需要在他的手掌内孕育微粒,这是根据动画来移动的。我所需要的只是动画应用后手掌的三维位置。。
动画期间手的图片: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[]数组。所以为了得到Bone10的转换,我相信代码看起来会是:
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;当我尝试上面的解时,我得到了混合的结果。与某些骨头,它正确地移动到动画的中间部分。但老实说没什么好的。有人能解释一下这是怎么回事吗?我怎么才能把骨头放在手掌上?我真的在黑暗中。两个月前,我才了解到一个矩阵是什么,直到这个星期我才学会了骨骼动画。
发布于 2014-07-30 16:40:03
好吧,这个bug很安静,令人沮丧,所以我从编码中休息了大约一个星期。两天前我又开始研究了。尝试许多随机的事情..。看看矩阵的值,寻找模式,我终于得到了它。这是一个图片,在那里的手是动画的,所有的骨头都突出了大的白色球完美。它也完美地跟随着动画!S.jpg
守则:
Matrix[] BoneTransforms = animtionPlayer.GetWorldTransforms();
for (int i = 0; i < BoneTransforms.Length; i++)
{
Vector3 v3 = new Vector3(BoneTransforms[i].M41, BoneTransforms[i].M42, BoneTransforms[i].M43);
v3 = Vector3.Transform(v3, GetWorld(Position, Rotation, Scale));//GetWorld is the models world matrix: position, rotation and scale.
Game1.DrawMarker(v3); //v3 is the position of the current Bone.
}我只是通过观察特定矩阵的所有值来编写这段代码。我知道M41,M42,M43是来自特定骨骼的X,Y,Z线。
发布于 2014-07-20 10:46:07
重新打开你的网眼设计师,把一个空的东西放在他的手中,让他知道粒子效应应该在哪里,把空的东西放在“掌心”骨头上,并跟踪这个空的人面对的是什么方向,这样你就可以朝正确的方向面对粒子,回复动画并重新导入它。我承认我对你使用的“网眼剥皮器”并不熟悉--但我可以想象,它支持骨骼中的儿童物体,比如空骨,因为它们经常被用于这些目的。你想得太多了。如果你不能用X盒工具箱做这件事,我不知道。
“转换矩阵”不一定是骨头的位置,所以我对这些函数返回的位置感到困惑。他们可能只是返回矩阵,它用来计算顶点的位置,这些顶点被加权到这些骨头上。没有一个功能,返回“世界位置”的手掌骨,并简单地跟踪你的动画到世界位置的空白或手掌骨?我搞不懂你要用变换矩阵做什么。如果你正在使用的库是好的,几乎可以肯定有一种方法可以得到一个骨头的世界坐标,在这种情况下,添加一个“跟踪骨头”,就可以让你跟踪动画或物体到该骨骼,甚至直接他们的父母。
https://stackoverflow.com/questions/24845536
复制相似问题