首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >骨骼及其矩阵的三维动画

骨骼及其矩阵的三维动画
EN

Stack Overflow用户
提问于 2014-07-19 22:21:40
回答 2查看 970关注 0票数 3

我真的是作为最后的手段来问这个问题。我已经两天没能解决这个问题了。因此,如果有人对3D,矩阵和动画了解一两件事,我会非常感谢你的投入。

我已经下载了这个项目并将其实现到我自己的项目:model中。我游戏中的角色施展法术时会移动双手。我已经成功地制作了这个动画并将它导入到项目中。但我需要在他的手掌内孕育微粒,这是根据动画来移动的。我所需要的只是动画应用后手掌的三维位置。

动画期间手的图片:http://s18.postimg.org/qkaipufa1/hands.png

如果您查看蒙皮模型示例项目: Class: AnimationPlayer.cs,您会注意到它处理矩阵3次:

代码语言:javascript
复制
    public void Update(TimeSpan time, bool relativeToCurrentTime,
                       Matrix rootTransform)
    {
        UpdateBoneTransforms(time, relativeToCurrentTime);
        UpdateWorldTransforms(rootTransform);
        UpdateSkinTransforms();
    }

并允许我们在每一步之后访问它们:

代码语言:javascript
复制
        /// 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的转换,我相信代码看起来会是:

代码语言:javascript
复制
Matrix[] M = animtionplayer.GetSkinTransforms();
Matrix transform = M[10];

好吧,现在是我不明白的部分。我不知道我需要使用的3个GetXXXXXXXXX函数中的哪个来获得掌心位置。

我认为阴影计算骨头位置的方法是把它们乘以它们的每一块骨头。所以:

代码语言:javascript
复制
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的职位。

代码语言:javascript
复制
Vector3 HandPosition = transform.Up;

当我尝试上面的解时,我得到了混合的结果。与某些骨头,它正确地移动到动画的中间部分。但老实说没什么好的。有人能解释一下这是怎么回事吗?我怎么才能把骨头放在手掌上?我真的在黑暗中。两个月前,我才了解到一个矩阵是什么,直到这个星期我才学会了骨骼动画。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-30 16:40:03

好吧,这个bug很安静,令人沮丧,所以我从编码中休息了大约一个星期。两天前我又开始研究了。尝试许多随机的事情..。看看矩阵的值,寻找模式,我终于得到了它。这是一个图片,在那里的手是动画的,所有的骨头都突出了大的白色球完美。它也完美地跟随着动画!S.jpg

守则:

代码语言:javascript
复制
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线。

票数 2
EN

Stack Overflow用户

发布于 2014-07-20 10:46:07

重新打开你的网眼设计师,把一个空的东西放在他的手中,让他知道粒子效应应该在哪里,把空的东西放在“掌心”骨头上,并跟踪这个空的人面对的是什么方向,这样你就可以朝正确的方向面对粒子,回复动画并重新导入它。我承认我对你使用的“网眼剥皮器”并不熟悉--但我可以想象,它支持骨骼中的儿童物体,比如空骨,因为它们经常被用于这些目的。你想得太多了。如果你不能用X盒工具箱做这件事,我不知道。

“转换矩阵”不一定是骨头的位置,所以我对这些函数返回的位置感到困惑。他们可能只是返回矩阵,它用来计算顶点的位置,这些顶点被加权到这些骨头上。没有一个功能,返回“世界位置”的手掌骨,并简单地跟踪你的动画到世界位置的空白或手掌骨?我搞不懂你要用变换矩阵做什么。如果你正在使用的库是好的,几乎可以肯定有一种方法可以得到一个骨头的世界坐标,在这种情况下,添加一个“跟踪骨头”,就可以让你跟踪动画或物体到该骨骼,甚至直接他们的父母。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24845536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档