Unity3d 如何用四元数实现飞机的统一旋转

Unity3d 如何用四元数实现飞机的统一旋转,unity3d,quaternions,Unity3d,Quaternions,如果有人有更好的题目,请告诉我。我在我的比赛中做了一些不同的事情,但这也解释了我的苦衷 这是我用来更好地理解四元数旋转的代码: // verifies that 90° turn on x axis points down (flying downwards) // expected : (0, -1, 0) // actual : (0, -1, 0) var down = Quaternion.identity * Quaternion.Euler(90,

如果有人有更好的题目,请告诉我。我在我的比赛中做了一些不同的事情,但这也解释了我的苦衷

这是我用来更好地理解四元数旋转的代码:

    // verifies that 90° turn on x axis points down (flying downwards)
    // expected : (0, -1, 0)
    // actual   : (0, -1, 0)
    var down = Quaternion.identity * Quaternion.Euler(90, 0, 0) * Vector3.forward;
    var rightRotation = Quaternion.Euler(0, 90, 0);
    
    // verifies that right rotation applied to forward direction results in a right direction
    // expected : (1, 0, 0)
    // actual   : (1, 0, 0)
    var right = rightRotation * Vector3.forward;
    
    // verifies that when flying downwards and doing a right turn it should be pointing right
    // expected : (1, 0, 0)
    // actual   : (0~, 0~, -1)
    var alsoRight = (Quaternion.LookRotation(down, Vector3.forward) * rightRotation) * down;
但是,结果向量是(0,0,-1),而不是(1,0,0)

所以我猜这里的问题是,我如何绕一个相对轴旋转一个四元数,而不是绕世界x轴旋转

如果我们假设初始零旋转是从后面开始的,我希望它在显示腹部的同时朝着正确的方向飞行


我的错误在哪里?

此脚本帮助我了解了如何执行此操作以及我以前的尝试失败的原因:

公共类eulerotation:单一行为
{
公共图书馆;
公共场所;
公共图书馆;
无效更新()
{
如果(z)
transform.rotation=四元数角度轴(0.1f,transform.forward)*transform.rotation;
如果(y)
transform.rotation=四元数角度轴(0.1f,transform.up)*transform.rotation;
if(x)
transform.rotation=四元数角度轴(0.1f,transform.right)*transform.rotation;
}
私有void FixedUpdate()
{
Debug.DrawRay(transform.position,transform.forward*-5,Color.blue);
Debug.DrawRay(transform.position,transform.right*-5,Color.red);
Debug.DrawRay(transform.position,transform.up*-5,Color.green);
}
}
执行transform.rotation*modifiedrotation时,结果总是错误的。在执行modifiedrotation*transform.rotation时,我确实得到了我期望的结果

因此,使用Quaternion.AngleAxis是相对于对象当前旋转旋转对象的正确方法,但轴旋转必须与当前旋转相乘,而不是相反