统一旋转局部轴系的方向的欧拉角

Euler angles for a direction respect to rotated local axis system in unity

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

我可以在我的平面上投影从原点到目标的方向,然后使用 Vector3.Angle(origin forward dir, Projected direction in plane)。

有没有一种方法可以像 Quaternion.FromToRotation(from, to).eulerAngles; 但是 那样用 Euler angles 的坐标系来获得它不是世界的那个,是局部旋转的那个(上图中旋转平面代表的那个)?

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

或者有比我实现的方法更直接的方法吗?

如果我理解你是对的,那么可能有很多可能的方法。

我想你可以,例如使用 Quaternion.ToAngleAxis 其中 returns 一个角度和围绕的轴旋转。然后您可以将此轴转换为对象的本地 space

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;
}

作为替代方案,我想是的,您也可以先将另一个向量转换为本地 space,然后 Quaternion.FromToRotation 应该已经在本地 space

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;
}