更新时修改四元数

时间:2015-10-23 14:25:19

标签: unity3d

我认为像许多初学者一样,我正在努力掌握四元数的应用,特别是如何手动操作它们......

我有一个mecanim模型(基本上是一个姿势数组)所以每一帧,我需要用最新的姿势更新我的模型,所以看起来 live

我使用23个mecanim骨骼,所以将我的模型的骨骼映射到Unity的mecanim系统上,我想以不同的方式对待 head ,使其转向与运动数据所指示的方向相反的方向,或者无论如何:表明头部移动的东西不同。

for (int i = 0; i < 23; i++)
{
    switch (i)
    {                       
        case (int)AnimationSegment.Head:
            model[i].rotation = pose[i].rotation;  // Let's turn the head...
            break;

        default:
            model[i].rotation = pose[i].rotation;
            break;
    }
}

如何将pose[i].rotation乘以(注释行上的那个),以便将头部旋转45度以上的程度?

以下是我自己的失败尝试(希望能说明我是如何误解四元数的,所以我很感激任何帮助):

Quaternion q = Quaternion.Euler(new Vector3(-x, y, z));

在此之后,我更改了该行并发表评论:

model[i].rotation = pose[i].rotation * q;

1 个答案:

答案 0 :(得分:1)

Quaternions可能有点复杂,即使在使用它们之后我总是要回到文档并查找它们。如果你真的想要了解所有这些东西以及如何将它们组合起来,你可以在线性代数上查找一些东西或者...

避免问题

使用现有四元数的.eulerAngles函数拉出围绕x,y和z轴的旋转。然后你可以随心所欲地操纵这些。例如,就像你说的那样旋转45度以上的东西

Vector3 existingAngles = model[i].rotation.eulerAngles;
Vector3 newAngles = new Vector3(existingAngles.x, existingAngles.y, existingAngles.z + 45);
model[i].rotation.eulerAngles = newAngles;

请记住,您总是可以通过4x4矩阵(四元数)转换为更加疲劳的角度,然后再转回,我建议您坚持操纵角度并重新分配简单的案例