私の問題が何であるかは非常に混乱しています。グローバル/ワールド座標をオブジェクトのローカル座標空間に変換する行列を設定しました。この変換行列は、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はこのマトリックスを使ってローカル座標軸を描画しています。
私はこの質問に不必要な詳細を含めないようにしましたが、もっと必要と思われる場合はお気軽にお問い合わせください。 :)
多くのありがとう。
この行列は、オブジェクトローカル空間をmodelview空間に変換します。したがって、ローカル空間でのモデルビュー空間の位置を見つけたい場合は、この変換を逆にする必要があります。つまり逆行列を使用する必要があります。 – datenwolf
あなたの答えをありがとう!トランスポーズを使用すると、正しい結果が得られます!なぜこれが当てはまるのかもう少し説明してください。私はこの笑い声の中で私の頭を得るために苦労している。 –
あなたがそこに現れる行列は正規直交性ではないので、あなたがしていることが正しいかどうかは疑問です。それが正規直交の場合、転置は逆であり、そうではありません。たぶん私はあなたが間違っていると理解しています。あなたは本当に順方向変換を行っています。その場合、OpenGLはCで行メジャーを使用している間に、列メジャーの順序付けを使用する(つまり、より高速なインクリメントインデックスが行です)ため、意味があります。これは、CとOpenGL間の転置索引付けにつながります。これは、あなたのトラブルの原因となる可能性があります。しかし、私は完全なコードを確認してください。 – datenwolf