相对于旋转局部轴系统的方向的欧拉角

问题描述

我想要在局部旋转轴系统中确定角度。基本上,我想在确定的旋转轴系统的平面中获得角度。最好的解释方式是图形化。

Enter image description here

我可以在平面上投影从原点到目标的方向,然后使用Vector3.Angle(原点前进方向,在平面上的投影方向)。

是否有一种类似Quaternion.FromToRotation(from,to).eulerAngles;的方式来获取此信息,但对于不是世界坐标系的坐标系,Euler angles ,但局部旋转了一个(由上图中的旋转平面表示)?

以使在局部y轴上旋转所需的角度为Quaternion.FromToRotation(from,to).localEulerAngles.y,因为基于this approach的局部欧拉角将为(0,-desiredAngle,0)。

还是有比我实现目标更直接的方法

解决方法

如果我了解您的要求,可能有很多可行的方法。

我认为您可以使用Quaternion.ToAngleAxis,它返回一个角度和周围的轴并且已旋转。然后,您可以将该轴转换为对象的本地空间

public Vector3 GetLocalEulerAngles(Transform obj,Vector3 vector)
{
    // As you had it already,still in worldspace
    var rotation = Quaternion.FromToRotation(obj.forward,vector);
    rotation.ToAngleAxis(out var angle,out var axis);

    // Now convert the axis from currently world space into the local space
    // Afaik localAxis should already be normalized
    var localAxis = obj.InverseTransformDirection(axis);

    // Or make it float and only return the angle if you don't need the rest anyway
    return localAxis * angle;
}

作为我提到的替代方法,我想是的,您也可以先将另一个矢量首先转换到局部空间,然后Quaternion.FromToRotation应该已经在局部空间中

public Vector3 GetLocalEulerAngles(Transform obj,Vector3 vector)
{
    var localVector = obj.InverseTransformDirection(vector);

    // Now this already is a rotation in local space
    var rotation = Quaternion.FromToRotation(Vector3.forward,localVector);
    
    return rotation.eulerAngles;
}