Unity3Dでの動きを指すオブジェクト

はじめに



ポイントに移動するオブジェクトがあるとします。 タスクは簡単で、たとえば補間を使用します。 しかし、オブジェクトがランダムな角度で回転できる場合はどうでしょうか? 補間のポイントを設定する方法は? 確かに、私たちの条件付きトロリーは車輪の方向にのみ動くべきです。 したがって、背面または前面のいずれかです。 ベクトル代数はこのタスクに役立ちます。



理論



ベクトル代数の助けを借りて、この問題は解決可能であるという事実を受け入れました。 したがって、ベクトルを使用して何かを行う必要があります。 でも何? まず、問題のベクトルの概念を投影します。 問題の状態により、補間のポイントを設定する必要があります。 つまり、グローバル/ローカル座標系を基準にした、その後オブジェクトが移動するポイント。 したがって、モーションを設定するために使用したオブジェクトのポイントと、最終的に必要なポイントとの間のセグメントはベクトルになります。



これで、ベクトルがあり、その終点の座標を見つける必要があることがわかりました。 この問題に対する独自の解決策には、一連のパラメーターが必要です。





私たち全員がこれを知っていると仮定します。 次に、問題は正弦定理の最も単純な公式に帰着します。



$インライン$ x / sin(α)= a / sin(90)$インライン$

$インライン$ x = a * sin(α)$インライン$

$インライン$ y / sin(90-α)= a / sin(90)$インライン$

$インライン$ y = a * sin(90-α)$インライン$



ここで、aはベクトルの長さ、αは座標軸に対する傾斜角



実際、この知識は、実際に問題を解決するのに十分です。



練習する



だから我々は知っている:





ほとんどすべての情報がありますが、このケースでは、オブジェクトの回転角度を数値的に知っていますが、どの軸が回転したかはわかりません。 追加データが必要です。 次に、四半期の概念を紹介します。 2次元のデカルト座標系には、それぞれ1から4までの4つのクォーターがあることは秘密ではありません。 四分の一軸ごとに異なる記号があります。







そして団結して、これも機能します。 開始するには、シーン内の四半期を識別する必要があります。 原点にキューブを作成し、移動して、どの座標が負で、どの座標が正であるかを確認します。 この例は、両方の座標が負であることを示しています。つまり、キューブは第3四半期にあります。







これで、スクリプトに直接進むことができます。 入力では、回転後の元のオブジェクトの変換と、後で移動するダミーの変換を受け入れます。 ダミーには最初、オブジェクトの座標があります。 次に、オブジェクトの前面が位置する四半期を決定します。 三角円は0〜360度に制限されているため、これは難しくありません。 4分の1を決定したら、各座標の傾斜角を計算します。 次に、コーナーのサインが正しいことを確認します。 その後、座標を計算するための最終式に傾斜角を送信します。 そして最後に、補間するダミーの新しい座標を設定します。



void ChekingQuarterUp(Transform vectorAngle, ref Transform empty) { float zangle = 0; float xangle= 0; float zcoord = 0.0f; float xcoord = 0.0f; int normangle = Mathf.RoundToInt (vectorAngle.eulerAngles.y); if (normangle >= 0 && normangle <= 90) // 1-  { zangle = 90 - normangle; xangle = 0 - normangle; xangle = (xangle < 0) ? xangle * -1 : xangle; zangle = (zangle < 0) ? zangle * -1 : zangle; } if (normangle > 270 && normangle <= 360) // 2-  { xangle = 360 - normangle; zangle = 270 - normangle; xangle = (xangle > 0) ? xangle * -1 : xangle; zangle = (zangle < 0) ? zangle * -1 : zangle; } if (normangle > 180 && normangle <= 270) // 3-  { xangle = 180 - normangle; zangle = 270 - normangle; xangle = (xangle > 0) ? xangle * -1 : xangle; zangle = (zangle > 0) ? zangle * -1 : zangle; } if (normangle > 90 && normangle <= 180) // 4-  { zangle = 90 - normangle; xangle = 180 - normangle; zangle = (zangle > 0) ? zangle * -1 : zangle; xangle = (xangle < 0) ? xangle * -1 : xangle; } zcoord = path * Mathf.Sin (zangle *Mathf.PI/180); xcoord = path * Mathf.Sin (xangle * Mathf.PI/180); float newpathx = empty.position.x + xcoord; float newpathz = empty.position.z + zcoord; empty.position = new Vector3 (newpathx, empty.transform.position.y, newpathz); }
      
      





おわりに



ご覧のとおり、解決策は非常に簡単です。 この方法を使用する前に、十分なデータがあるかどうかを確認してください。そうしないと、タスクが一意に解決できなくなります。 たとえば、軸に対する傾斜角を削除すると、無限の数の点を持つ円が解領域になります。



「後方へ」移動する場合は、四分の一に従って座標の符号を直径方向に変更するだけです。 3次元空間でポイントを定義することにした場合は、そこにさらに「クォーター」があることを考慮してください。



ここでメソッドの実装例を取ることができます



All Articles