统一旋转局部轴系的方向的欧拉角
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;
}
我想要在局部旋转轴系统中确定一个角度。基本上我想在确定的旋转轴系统的平面中实现角度。最好的解释方式是图形化。
我可以在我的平面上投影从原点到目标的方向,然后使用 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;
}