unity 旋转差和方向
unity rotation difference and direction
我想知道两个物体在一个轴上的旋转差异,例如在 Y 轴上。
我尝试使用 Quaternion.Angle 但它计算的是整个旋转,而不是在一个轴上
使用
angle=transform.rotation.eulerAngles.y-target.transform.rotation.eulerAngles.y;
有效,
然而这并没有告诉我目标的方向与我相比,向左或向右有多少角度?
编辑:
不,它不起作用,它仅在变换的 x 和 z 旋转轴均为 0 时才起作用。
如果,例如我把两个开始旋转都放在 (349.8176,113.8314,254.5617)
,然后我将目标向右旋转 3 度,它变成了 (352.7103,113.0266,254.684),这将 return Y 角度差 0.8 而不是 3
方向使用这个:
Vector3 offset = transform.position - target.position;
您可以简单地使用前向向量之间的标量积来确定它们是面向同一方向还是相互注视(或远离):
float dot = Vector3.Dot( transform.forward, target.transform.forward );
bool sameDirection = dot >= 0;
您甚至可以使用矢量数学来计算角度,而无需展开巨大的四元数设定:
// align forward vectors to the XZ plane / Y axis first
Vector3 sourceForward = transform.forward;
Vector3.OrthoNormalize( Vector3.up, ref sourceForward );
Vector3 targetForward = target.transform.forward;
Vector3.OrthoNormalize( Vector3.up, ref targetForward );
// get the angle between both transforms arount the Y axis
float dot = Vector3.Dot( sourceForward, targetForward );
float angleRad = Mathf.Acos( dot );
float angleDeg = Mathf.Rad2Deg( angleRad );
// see if the angle is clockwise or counter-clockwise
Vector3 up = Vector3.Cross( sourceForward, targetForward );
angleDeg = up.y < 0 ? -angleDeg : +angleDeg;
免责声明:这一切都是纯理论的,因为我目前无法使用 Unity 3D 进行测试。
我想知道两个物体在一个轴上的旋转差异,例如在 Y 轴上。
我尝试使用 Quaternion.Angle 但它计算的是整个旋转,而不是在一个轴上
使用
angle=transform.rotation.eulerAngles.y-target.transform.rotation.eulerAngles.y;
有效, 然而这并没有告诉我目标的方向与我相比,向左或向右有多少角度?
编辑: 不,它不起作用,它仅在变换的 x 和 z 旋转轴均为 0 时才起作用。
如果,例如我把两个开始旋转都放在 (349.8176,113.8314,254.5617) ,然后我将目标向右旋转 3 度,它变成了 (352.7103,113.0266,254.684),这将 return Y 角度差 0.8 而不是 3
方向使用这个:
Vector3 offset = transform.position - target.position;
您可以简单地使用前向向量之间的标量积来确定它们是面向同一方向还是相互注视(或远离):
float dot = Vector3.Dot( transform.forward, target.transform.forward );
bool sameDirection = dot >= 0;
您甚至可以使用矢量数学来计算角度,而无需展开巨大的四元数设定:
// align forward vectors to the XZ plane / Y axis first
Vector3 sourceForward = transform.forward;
Vector3.OrthoNormalize( Vector3.up, ref sourceForward );
Vector3 targetForward = target.transform.forward;
Vector3.OrthoNormalize( Vector3.up, ref targetForward );
// get the angle between both transforms arount the Y axis
float dot = Vector3.Dot( sourceForward, targetForward );
float angleRad = Mathf.Acos( dot );
float angleDeg = Mathf.Rad2Deg( angleRad );
// see if the angle is clockwise or counter-clockwise
Vector3 up = Vector3.Cross( sourceForward, targetForward );
angleDeg = up.y < 0 ? -angleDeg : +angleDeg;
免责声明:这一切都是纯理论的,因为我目前无法使用 Unity 3D 进行测试。