2015-10-23 21 views
1

我认为像很多新手,我奋力把握四元数的应用,特别是如何手动操纵它们...修改四元数,同时更新

我有一个mecanim模型(即基本姿势的数组)所以每一帧,我需要更新我的模型与最新的姿势,所以它看起来生活

我用23根mecanim骨头,所以有映射我的模型的骨骼到Unity的mecanim系统,我想对待不同,通过使它变成在相反的方向是什么运动数据使然,或什么:东西显示头部移动的方式不同。

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

您将需要一个void更新方法。请参阅http://docs.unity3d.com/ScriptReference/MonoBehaviour.Update.html。至于实际的代码,我也是Unity的初学者,但是尝试一下你之前做过的事情,并将其作为每帧更新方法更新中的任何代码以无效更新方法实现。如果你想让头部与当前方向相反,那么x和y方向的旋转-1会简单地乘以-1? –

回答

1

四元数可能有点复杂,即使在使用它们之后,我总是必须回到文档并查找它们。如果你真的想了解所有的东西,以及如何将它们结合起来的作品,你可以看看一些东西,线性代数或...

避免问题

使用您现有的四元数的.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矩阵(四元),以欧拉角和回工作,我会建议你坚持操纵角度并重新分配简单情况。