创建3D骨架时3D旋转问题

时间:2012-01-25 21:35:55

标签: c# math graphics matrix xna

我正在使用XNA框架在C#中编写一个简单的BVH解析器。目前我已经设法解析了所有数据,我的目标是找出骨架中所有关节的全局坐标。

我遇到的问题是骨骼似乎没有考虑其父母的轮换。例如,如果我移动我的小腿,我希望我的脚也可以改变方向,并保持脚和小腿之间的角度相同。我注意到的是骨关节的平移是正确的,但骨的整体旋转与骨的局部旋转相同。下面的图片可能会帮助您了解问题所在:

skeleton http://i40.tinypic.com/18kv2d.png

注意:pic标题中有一个错误,它应该是“左上腿围绕z轴旋转”而不是x轴。

我原本预计小腿部分也会因父母方向改变而旋转1弧度。

所以代码如下(我正在使用XNA和C#):

foreach (Bone b in bones)
{
            //Calculate the local transform matrix
            b.localTransform = Matrix.CreateTranslation(b.Offset) * Matrix.CreateRotationZ(MathHelper.ToRadians(b.z)) * Matrix.CreateRotationY(MathHelper.ToRadians(b.y)) * Matrix.CreateRotationX(MathHelper.ToRadians(b.x));
            Bone parent = b.parent;
            if (parent != null)
            {
                //Calculate global transform matrix
                b.globalTransform = parent.globalTransform * b.localTransform;
                b.location = b.globalTransform.Translation;
                lines.Add(new Tuple<Vector3, Vector3>(parent.location, b.location));
            }
}

每个骨骼都假设它的父母全局转换是正确的,因为列表是有序的,所以父母总是来到孩子面前。根骨骼没有旋转,也没有偏移,并且已根据此设置了全局变换。我想知道我在这里做错了什么?

我做了一个仅使用2D的简单示例:

Matrix bone1 = Matrix.CreateTranslation(new Vector3(3, 0, 0)) * Matrix.CreateRotationZ(1); 
Matrix bone2 = Matrix.CreateTranslation(new Vector3(3, 0, 0)) * Matrix.CreateRotationZ(1); 

lines.Add(new Tuple<Vector3, Vector3>(Vector3.Zero, bone1.Translation)); 
lines.Add(new Tuple<Vector3, Vector3>(bone1.Translation, (bone1 *bone2).Translation));

将此图画显示在屏幕上显示了我的期望。第一个骨骼围绕原点旋转1弧度,第二个骨骼围绕原点旋转2弧度。

我使用以下作为解析和解释BVH数据的参考: http://www.dcs.shef.ac.uk/intranet/research/resmes/CS0111.pdf

0 个答案:

没有答案