0

私の問題が何であるかは非常に混乱しています。グローバル/ワールド座標をオブジェクトのローカル座標空間に変換する行列を設定しました。この変換行列は、4つのベクトル(前方、上方、側方、および位置)からの物体情報を使用して構成されます。このローカリゼーションマトリクスは各オブジェクトの描画時にglMultMatrixf()に渡されるので、ローカル座標系を視覚化するために各オブジェクトの周りに単純な軸を描くことができます。これは完全にうまく機能し、予想どおりに動作し、オブジェクトが移動して世界で回転すると、ローカルの座標軸も同様に動きます。ローカライズマトリクスで混乱 - OpenGLに渡されたときには動作しますが、自分で作ったときには動作しませんか?

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

マイローカライズ行列は次のとおりです。

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はこのマトリックスを使ってローカル座標軸を描画しています。

私はこの質問に不必要な詳細を含めないようにしましたが、もっと必要と思われる場合はお気軽にお問い合わせください。 :)

多くのありがとう。

+0

この行列は、オブジェクトローカル空間をmodelview空間に変換します。したがって、ローカル空間でのモデルビュー空間の位置を見つけたい場合は、この変換を逆にする必要があります。つまり逆行列を使用する必要があります。 – datenwolf

+0

あなたの答えをありがとう!トランスポーズを使用すると、正しい結果が得られます!なぜこれが当てはまるのかもう少し説明してください。私はこの笑い声の中で私の頭を得るために苦労している。 –

+0

あなたがそこに現れる行列は正規直交性ではないので、あなたがしていることが正しいかどうかは疑問です。それが正規直交の場合、転置は逆であり、そうではありません。たぶん私はあなたが間違っていると理解しています。あなたは本当に順方向変換を行っています。その場合、OpenGLはCで行メジャーを使用している間に、列メジャーの順序付けを使用する(つまり、より高速なインクリメントインデックスが行です)ため、意味があります。これは、CとOpenGL間の転置索引付けにつながります。これは、あなたのトラブルの原因となる可能性があります。しかし、私は完全なコードを確認してください。 – datenwolf

答えて

1

私が推測しなければならないが、私は、OpenGLマトリックス乗算の問題の二つのソースを指摘したいと思います:

  1. をモデルビュー行列は、(カメラが原点に常に座標系に変換します0,0,0)がz軸に沿って見えます。したがって、ローカル→グローバル変換を適用する前に「カメラを移動する」変換を行った場合は、カメラの動きを補正する必要があります。そうしないと、カメラの座標空間にローカルな座標が得られません。行列を構築したときにカメラの変形を含めましたか?

  2. OpenGLの行列は、COLUMN-majorです。

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

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

    :あなたは16個の値を持つ配列を有する場合、要素は、そのように順序付けされます

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

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

あなたのマトリックスはまた、奇妙と思われます。最初の3つの列は、回転または拡大/縮小変換を適用したことを示しています。最後の列は、各座標要素に適用される平行移動量を示します。数字はあなたのオブジェクトの位置と同じです。つまり、出力xの座標を-50.8にしたい場合は、最初の行の最初の3つの要素が0になるはずです。

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

< ---これはゼロでなければなりませんが、-48,339です。

だから、実際に行列を構築するときに問題があると思います。おそらく、行列をどのように構築するか説明できます。

+0

私はこのチュートリアルを使いました:http://knol.google.com/k/matrices-for-3d-applications-view-transformation# @datenwolfがコメントしたことは少し助けになりました。私が現在言っていることで世界座標を変換すると、私の「グローバリゼーション」マトリックスは正しい結果を得ることができます。私はこれがなぜであるかの周りに私の頭をかなり持っていない。 –

+0

マトリックスを間違って印刷していました。私はどこにでもカラムメジャー表記を使用しています! (私は私の投稿を編集しました - これはいくつかの問題を解決するはずです)。ありがとう! –

関連する問題