3

我一直在努力解决我认为应该是一个非常简单的问题:

问题示意图.

我知道当前的航向角(比如 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();
    }
4

2 回答 2

2

您可以将您的变换向前,并将矢量带到您的目标,并从中获得角度或旋转:

Vector3 vectorToTarget = target.transform.position - transform.position;
Vector3 facingDirection = transform.forward; // just for clarity!

float angleInDegrees = Vector3.Angle(facingDirection, vectorToTarget);
Quaternion rotation = Quaternion.FromToRotation(facingDirection, vectorToTarget);

请注意,旋转是相对的;即,这是您需要从当前位置应用到面向目标的旋转。

于 2015-07-24T16:22:46.587 回答
0

试试这个

您可以直接从 transform.position 获取向量距离向量,然后 vector3.normalize (target.position - object.position)

这是物体想要移动的角度

于 2015-07-24T05:48:22.280 回答