我一直在努力解决我认为应该是一个非常简单的问题:
.
我知道当前的航向角(比如 15 度),并且给定目标游戏对象的变换,我想计算我应该朝向目标旋转的角度。在上面的例子中,我想计算 335ish 度。
请注意,我需要计算目标角度,我有另一个类,给定一个角度,负责将航向旋转到所需的角度。我知道 Transform.LookAt() 和其他类似函数,它们不适用于这种情况,因为原因(在其他类中,由于项目限制,我基本上计算欧拉四元数和 Lerp 直到达到目标角度,Transform.LookAt() 不起作用)。
在第一种方法中,我尝试用 Vector3.forward 的点积和方向向量计算角度 theta,但效果不太好(永远旋转或方向错误)
targetAngle = Vector3.Angle(Vector3.forward, (target pos - current pos).normalized);
我想也许如果我可以计算当前的航向方向向量,我可以取它和目标方向向量的点积来得到角度 theta,然后使用 theta 和当前角度来计算目标角度(360 - theta 什么的?) 得到我想旋转到的角度。问题是,我只有当前角度和当前位置,我不明白如何根据该信息计算当前航向方向向量。我是否只是在当前位置的 Z 值上添加一些任意常数并从当前位置减去,以获得 dir 向量?看起来很hacky,好像它不应该工作。
欢迎任何想法。
编辑:附加信息
定向代码 /u/Asad 询问:
// Calculate the target Quat to rotate all children by
Quaternion targ = Quaternion.Euler(0, 0, targetAngleHeading);
// Calculate the Linear interpolation to apply to all children
Quaternion lerp = Quaternion.Lerp(children[0].transform.localRotation, targ, Time.deltaTime * speedHeading_dps);
foreach (GameObject c in children)
{
// Apply lerp calcualted above to all children
c.transform.localRotation = lerp;
}
// Update the current heading angle 1st child's local z angle
currentAngleHeading = turrets[0].transform.localEulerAngles.z;
然后在 FixedUpdate() 我有:
if (currentAngleHeading != targetAngleHeading)
{
DesiredHeading();
}