0

ここで私の問題が何であるかについて、私は非常に混乱しています。グローバル/ワールド座標をオブジェクトのローカル座標空間に変換するマトリックスを設定しました。この変換行列は、4 つのベクトル (前方、上、横、および位置) からのオブジェクト情報を使用して構築されます。glMultMatrixf()このローカリゼーション マトリックスは、各オブジェクトの描画時に に渡されます。これにより、各オブジェクトの周りに単純な軸を描画して、ローカル座標系を視覚化できます。これはまったく問題なく期待どおりに機能し、オブジェクトがワールド内で移動および回転すると、ローカル座標軸も移動および回転します。

問題は、この同じ行列を列ベクトルで乗算すると (あるオブジェクトのグローバル位置を別のオブジェクトのローカル座標系に変換するために)、結果がまったく期待どおりにならないことです。例えば:

私のローカライズ マトリックスは次のとおりです。

0.84155    0.138      0.5788     0
0.3020     0.8428    -0.5381     8.5335
0.4949    -0.5381    -0.6830    -11.6022
0.0        0.0        0.0        1.0

位置列ベクトルを入力します。

-30.0
-30.0
-30.0
1.0

そして、次の出力を取得します。

-99.2362
-1.0199
4.8909
1.0000

この時点でのオブジェクトの位置は (-50.8, 8.533, -11.602, 1) であるため、x 座標の出力が -99.2362 ほど大きくなることはあり得ないことがわかっています。さらに、2 つのグローバル ポイント間の距離と、ローカライズされたポイントと原点の間の距離を見つけると、それらは異なります。

これを Matlab で確認したところ、行列の乗算が正しいようです (注: Matlab では、最初にローカライズ行列を転置する必要があります)。そのため、ローカライズ マトリックスが正しく構築されていないと考えざるを得ませんが、OpenGL はこのマトリックスを使用してローカル座標軸を正常に描画しています。

この質問には不必要な詳細を含めないようにしていますが、もっと必要だと感じたら、遠慮なく質問してください。:)

どうもありがとう。

4

1 に答える 1

1

推測する必要がありますが、OpenGL 行列乗算の問題の 2 つの原因を指摘したいと思います。

  1. モデルビュー マトリックスは、カメラが常に原点 (0,0,0) にあり、z 軸に沿って見える座標系に変換されます。そのため、ローカルからグローバルへの変換を適用する前に「カメラを移動する」ために何らかの変換を行った場合は、カメラの動きを補正する必要があります。そうしないと、カメラの座標空間に対してローカルな座標が取得されます。マトリックスを作成したときにカメラ変換を含めましたか?

  2. OpenGL の行列は COLUMN-major です。16 個の値を持つ配列がある場合、要素は次のように並べられます。

    [0][4][8][12]

    [1][5][9][13]

    [2][6][10][14]

    [3][7][11][15]

あなたのマトリックスも奇妙に思えます。最初の 3 つの列は、回転またはスケーリング変換を適用したことを示しています。最後の列は、各座標要素に適用された移動量を示しています。数字はオブジェクトの位置と同じです。つまり、出力 x 座標を -50.8 にしたい場合、最初の行の最初の 3 つの要素の合計がゼロになる必要があります。

-30*0.8154 -30*0.3020 -30*0.4939 + 1 * -50.8967

<---これはゼロである必要があります--------> しかし、-48,339 です。

ですから、マトリックスを構築するときに本当に問題があると思います。おそらく、マトリックスの作成方法を説明できます...

于 2011-03-07T20:16:19.137 に答える