3

私は非常に単純な問題であるべきだと思うことに苦労してきました:

問題の図.

現在の進行方向の角度 (たとえば 15 度) を知っていて、ターゲットのゲームオブジェクトの変換を考慮して、ターゲットに面するために回転する必要がある角度を計算したいと考えています。上記の例では、たとえば 335 度を計算したいと思います。

target angleを計算する必要があることに注意してください。角度を指定すると、見出しを目的の角度に回転させる別のクラスがあります。私は Transform.LookAt() および他の同様の関数を認識していますが、理由があるため、この状況では適用されません (他のクラスでは、プロジェクトの制約により、ターゲット角度に到達するまで基本的にオイラー四元数と Lerp を計算します) 、Transform.LookAt() は機能しません)。

最初のアプローチでは、Vector3.forward の Dot 積と方向ベクトルを使用して角度シータを計算しようとしましたが、正しく機能しませんでした (永遠に回転したり、間違った方向に回転したりしました)。

問題の図

targetAngle = Vector3.Angle(Vector3.forward, (target pos - current pos).normalized);

現在の進行方向ベクトルを計算できれば、それとターゲット方向ベクトルのドット積をとって角度シータを取得し、シータと現在の角度を使用してターゲット角度 (360 - シータなど) を計算できるのではないかと考えました。 ?) 回転したい角度を取得します。問題は、現在の角度と現在の位置しか持っていないことです。その情報から現在の進行方向ベクトルを計算する方法がわかりません。現在の位置の Z 値に任意の定数を追加し、そこから現在の位置を引いて、方向ベクトルを取得するだけですか? ハックしているようで、うまくいかないようです。

問題の図

どんなアイデアでも大歓迎です。

編集:追加情報

オリエンテーション コード /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