Unity旋转差异和方向

3
我想知道两个物体在同一轴上的旋转差异,例如在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的Y角度差异,而不是3。
2个回答

2

您可以简单地使用前向矢量之间的点积来确定它们是否朝着相同方向或相互看向(或背对):

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 的符号将会翻转。 - Alvin Wiltan

0

使用这个方向:

Vector3 offset =  transform.position - target.position;

啊,我的方向意思是旋转方向。例如,物体A是30度,物体B是60度,这意味着物体B向右旋转30度。 - Alvin Wiltan
你的代码会返回你想要的结果,从A到B的旋转差异。 左侧或右侧带有符号。例如:如果A是60,B是30,则得到-30。 - joreldraw
我刚刚测试了两个不同旋转和位置的对象,还有0,0,0,并且得到了正确的差异:0,0,0。 - joreldraw
你能告诉我最终你想用这个旋转差异做什么吗? - joreldraw
它将会像身体顶部的炮塔或类似的东西。如果身体在0,0,0旋转位置,而炮塔在0,30,0/0,330,0旋转位置,使用angle=transform.rotation.eulerAngles.y-target.transform.rotation.eulerAngles.y;则旋转差异应为-330/-30而不是-30/+30。我想让身体转动得越快,角度差异就越大。 - Alvin Wiltan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接