C# 根据当前角度和目标位置计算目标角度?

C# 根据当前角度和目标位置计算目标角度?,c#,math,unity3d,vectormath,C#,Math,Unity3d,Vectormath,我一直在努力解决我认为应该是一个非常简单的问题: 我知道当前的航向角(比如15度),给定目标游戏对象的变换,我想计算我应该朝着目标旋转的角度。在上面的例子中,我想计算一下,比如说335度 注意,我需要计算目标角度,我有另一个类,给定一个角度,负责将航向旋转到所需的角度。我知道Transform.LookAt()和其他类似的函数,它们不适用于这种情况,因为原因(在另一个类中,我基本上计算一个Euler四元数和Lerp,直到我到达目标角度,由于项目约束,Transform.LookAt()不起作用

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

我知道当前的航向角(比如15度),给定目标游戏对象的变换,我想计算我应该朝着目标旋转的角度。在上面的例子中,我想计算一下,比如说335度

注意,我需要计算目标角度,我有另一个类,给定一个角度,负责将航向旋转到所需的角度。我知道Transform.LookAt()和其他类似的函数,它们不适用于这种情况,因为原因(在另一个类中,我基本上计算一个Euler四元数和Lerp,直到我到达目标角度,由于项目约束,Transform.LookAt()不起作用)

在第一种方法中,我试着用矢量3的点积计算角度θ。正向和方向矢量不太正确(要么永远旋转,要么方向错误)

我想如果我可以计算当前的航向向量,我可以用它和目标方向向量的点积得到角度θ,然后用θ和当前角度算出目标角度(360θ或其他?),得到我想要旋转的角度。问题是,我只有当前角度和当前位置,我不知道如何根据这些信息计算当前航向向量。我只是在当前位置的Z值上加上一些任意常数,然后从中减去当前位置,得到一个dir向量吗?看起来很粗糙,好像不应该用

欢迎提出任何意见

编辑:其他信息

方向代码/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()中,我有:

试试这个

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


这是您想要移动的角度对象。您可以将变换向前移动,并将向量移动到目标,然后从以下各项中获取角度或旋转:

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);

注意,旋转是相对的;i、 例如,这是您需要从当前位置应用的旋转,以面向目标。

这是2D吗?如果不是,你需要一个单位向量来表示你当前的方位,而不是像15度这样的标量角。同样,如果你展示了你的代码对你正在计算的角度的作用,这也会有所帮助。您正确计算了
(0,0,1)
和所需航向之间的角度。你确定你的旋转代码也解释了相对于
(0,0,1)
提供的角度吗?注释“没有完全正确地工作(要么永远旋转,要么旋转方向错误)”,以及图表的证据,强烈表明你没有小心你的标志。你所描述的数学应该是正确的,而且实现起来几乎微不足道;你唯一可以做错事的就是把你的标志混在一起,它是3D的,对吧,我可以,但我该从哪里开始呢?是的,我肯定另一个类中的旋转代码是有效的,我写了另一个脚本,用它在两个给定的角度之间打乒乓球,在给定的角度下有效。什么?target.pos-object.pos的标准化是方向向量,它不会给我一个角度…对,我在第一个方法的最后一步尝试了这个。我只是将角度以度为单位传递给我的另一个类,该类处理你在最后一句中所说的内容,即将旋转从当前位置应用到以度为单位的给定角度。我正在重温这种方法,也许我在某个地方犯了一个愚蠢的错误,所以在重新实施第一种方法后,我注意到了一个小错误。我使用的是Vector3.forward,而不是子项[0]。transform.forward。修正后,计算出的角度与我想要的正好相反,所以我加了180,并以360为模,以获得正确的旋转角度。另一件事,如果我想不断地或至少非常有规律地重新计算这些(比如朝着移动的目标旋转,或在移动时旋转,或两者兼而有之),有没有关于我需要改变或做什么的建议?如果你想平稳地旋转(即在多个帧上)您需要查看
四元数.Lerp
四元数.Slerp
。所有这些都足够快,您可以重新计算每一帧(假设您没有一次运行一百万帧!)。如果你的角度是相反的,那么你可能是在向后计算
vectoTarget
值。我正在这样做,如果你在OP中查看我的编辑,你会看到我使用Lerp进行实际旋转。我正确地进行了targetPos-currentPos的方向向量计算,还有其他的想法吗?扩展到“我正在这样做”-虽然我使用了lerp,但当我计算每帧的目标角度时,它不能正确地跟踪运动。它最终会偏离几度。如果我只触发一次目标角度计算,它会更精确,但无法解释运动。
    if (currentAngleHeading != targetAngleHeading)
    {
        DesiredHeading();
    }
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);