我想要在局部旋转轴系统中确定角度。基本上,我想在确定的旋转轴系统的平面中获得角度。最好的解释方式是图形化。
我可以在平面上投影从原点到目标的方向,然后使用Vector3.Angle(原点前进方向,在平面上的投影方向)。
是否有一种类似Quaternion.FromToRotation(from, to).eulerAngles;
的方式来获取此信息,但对于不是世界坐标系的坐标系,Euler angles ,但局部旋转了一个(由上图中的旋转平面表示)?
以使在局部y轴上旋转所需的角度为Quaternion.FromToRotation(from, to).localEulerAngles.y
,因为基于this approach的局部欧拉角将为(0,-desiredAngle,0)。
还是有比我实现目标更直接的方法?
答案 0 :(得分:1)
如果我了解您的要求,可能有很多可行的方法。
我认为您可以使用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;
}