1

コンピューターから特定の方向に動くヘッド カメラを制御しようとしています。カメラは、パン (540 度) とチルト (280 度) によってのみ制御されます。問題は、オイラー角をこれらのパン角度とチルト角度にすることです。

XY および Z 回転 (Eurler 角) としましょう。

今度は、(物理的な!) パンチルト カメラを同じ方向に動かしたいと思います。しかし、xyz ベクトルをパンの傾きに変換する方法がわかりません。

4

1 に答える 1

1

直交同種 4x4 変換行列に切り替える

  • オイラー角は、複雑なメモ化の動きには適していません。
  • M は 4x4 カメラ変換行列です

Ang によるグローバル ワールド X 軸周りの回転:

double c=cos(ang),s=sin(ang);
double Q[16]=
    {
    1, 0, 0, 0,
    0, c,-s, 0,
    0, s, c, 0,
    0, 0, 0, 1
    };
M=M*Q;

Ang によるローカル カメラの X 軸周りの回転:

double c=cos(ang),s=sin(ang);
double Q[16]=
    {
    1, 0, 0, 0,
    0, c,-s, 0,
    0, s, c, 0,
    0, 0, 0, 1
    };
M=((M^-1)*Q)^-1;

glm のような変換行列用のライブラリがありますが、私は自分のものを好みます

  • 多くの人が同意しないことはわかっていますが、私のものは他の公開されているものよりも長くここにいます
  • そして私はそれに慣れています
  • アイデアは、常に M の直接行列と逆行列の両方を覚えておくことです
  • 更新されたフラグと更新されていないフラグがあります
  • そして、操作の前に、使用されたマトリックスが関連しているかどうかを確認してください
  • そうでない場合は、他のものから計算します
  • また、操作の数を追加し、しきい値に達した後
  • 直交性または正規直交性のチェック/修正を行う

ここでは、同種 (4x4) と通常 (3x3+1x3) の 3D 変換行列の違いを確認できます。

今カメラの運転

  • 上記の 4x4 変換行列のリンク内の画像を参照します
  • 私は通常、移動/視線方向として Z 軸を使用します
  • 最初にマトリックスをユニットにリセットするか、必要に応じてその位置と向きに設定します
  • 回転させたいときは、ローカル回転を使用します
  • 移動したいときは、位置x0、y0、z0に移動したいオフセットを(グローバル座標で)追加するだけです
  • dユニットがこれを行う場合、前進するには:

    x0+=d*Zx;
    y0+=d*Zy;
    z0+=d*Zz;
    
  • 横方向の移動には X ベクトルを使用

  • 上下用 Yベクトル
  • X軸周りとは異なる回転には、異なるQマトリックスを使用するだけです

  • Y軸周りの回転

     c, 0, s, 0,
     0, 1, 0, 0,
    -s, 0, c, 0,
     0, 0, 0, 1;
    
  • Z軸周りの回転

     c,-s, 0, 0,
     s, c, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1;
    
于 2014-02-12T09:13:42.357 に答える