4

私は 3D 空間 (X、Y、Z) の点を扱ってきましたが、これらの点のうちの 2 点間のピッチとヨーを計算できるようにしたいと考えています。

私の現在のコード:

pitch = (float) (1/Math.tan((Y1 - Y2) / (Z1 - Z2)));
yaw = (float) (1/Math.tan((X1 - X2) / (Z1 - Z2)));

ここで、X1、X2、Y1、Y2、Z1、Z2 はすべて実行時まで不明であり、その時点でランダムに生成された 2 つのポイントから収集されます。

何らかの理由で、私の結果は大幅に間違っています。さまざまな組み合わせを試し、数え切れないほどのことをグーグル検索しましたが、何も思いつきませんでした.

いくつかの制約は次のとおりです。

  1. ピッチは 90 以下、または -90 以上 (90 => ピッチ => -90) にする必要があります。
  2. ロールがないので当てはまらない
  3. すべての座標は、プログラムで宣言されるまで不明です
  4. ピッチは Z 軸に沿って開始します。Z 軸は前方/後方であり、上向きのピッチングが正です。
  5. Y が上、Z が前後、X が横
  6. ヨーは Z 軸の真下を向き始めます

3D 角度を扱うのは初めてで、私の例のように、2 つの異なる 2D 平面でピッチとヨーを別々に計算できることを読みましたが、うまくいきません。

どんな助けでも大歓迎です。

4

1 に答える 1

7

多分これはあなたを助けるでしょう。これは、LucasEmanuelによるチュートリアルであり、Minecraft のピッチ、ヨー計算ですが、あなたのチュートリアルでも機能するはずです!

まず、デルタ x、y、z を計算する必要があります。

double dX = first_location.getX() - second_location.getX();
double dY = first_location.getY() - second_location.getY();
double dZ = first_location.getZ() - second_location.getZ();

その後、ヨーを計算する必要があります。

double yaw = Math.atan2(dZ, dX);

そしてそれのためのピッチ:

double pitch = Math.atan2(Math.sqrt(dZ * dZ + dX * dX), dY) + Math.PI;

ベクトルが必要な場合は、次のようにします。

double X = Math.sin(pitch) * Math.cos(yaw);
double Y = Math.sin(pitch) * Math.sin(yaw);
double Z = Math.cos(pitch);

Vector vector = new Vector(X, Z, Y);

オリジナルチュートリアル

基本的に計算は同じはずです。お役に立てなかったらごめんなさい!

于 2013-08-12T11:06:02.740 に答える