我认为像许多初学者一样,我正在努力掌握四元数的应用,特别是如何手动操作它们......
我有一个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;
答案 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矩阵(四元数)转换为更加疲劳的角度,然后再转回,我建议您坚持操纵角度并重新分配简单的案例