统一旋转差异和方向

Posted

技术标签:

【中文标题】统一旋转差异和方向【英文标题】:unity rotation difference and direction 【发布时间】:2015-07-07 02:38:27 【问题描述】:

我想知道两个对象在一个轴上的旋转差异,例如在 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),这将返回 0.8 而不是 3 的 Y 角差

【问题讨论】:

【参考方案1】:

您可以简单地使用前向向量之间的标量积来确定它们是否都面向相同的方向或看(或远离)彼此:

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 进行测试。

【讨论】:

光滑!这个有效,谢谢!但是,如果对象 x 旋转超过 90 度,则 angleDeg 的符号被翻转【参考方案2】:

方向用这个:

Vector3 offset =  transform.position - target.position;

【讨论】:

啊不,我的意思是方向是旋转方向。例如对象 A 是 30 度,对象 B 是 60 度,这意味着对象 B 向右 30 度。 您的代码返回给您您想要的,从 A 到 B 的差异旋转。右侧或左侧带有签名。即:如果 A 是 60 而 B 是 30 你得到 -30 因为奇怪的是,如果两个对象开始旋转都是 0,0,0,那么旋转差异 (0-330/0-30) 将是 -330 和 -30 而不是 -30/+30 我只测试了 2 个不同旋转的对象,以及 0,0,0 的位置,我得到了正确的差异:0,0,0。 你能告诉我你最后喜欢用这个轮换差异做什么吗?

以上是关于统一旋转差异和方向的主要内容,如果未能解决你的问题,请参考以下文章

统一。如何使玩家转向运动方向

Unity编程四元数(Quaternion)与欧拉角

OpenGL:沿该方向旋转和移动

识别触摸移动方向

如何在SVG中旋转期间保持文本方向不变

快速查找 iPhone 的指南针方向