モデルビュー マトリックスの取得に関して、glGetFloatv で予期しない問題が発生しているようです (これは、射影マトリックスを取得しようとした場合にも発生します)。
何が起こるのですか?行列が実際に何であるかに関係なく、関数は平行移動と回転の直後であっても恒等行列を返します! どちらのマトリックスも恒等マトリックスではないことはわかっています。なぜなら、ゲームの世界を移動するときの画面上のビジュアルはまさに期待どおりだからです。
私の関数は、この小さな Common Lisp コード (デバッグ目的ですぐに変更された後に行列を出力するステートメントで変更されています) であり、その下にさらに注記があります。
(defun apply-camera-gl (camera)
(declare (type scene-camera camera))
(declare (optimize (speed 3) (safety 1) (debug 3) (space 0)))
"Passes the necessary OpenGL commands to apply the position and fov for the camera."
(let ((pos (scene-camera-position camera))
(rot (scene-camera-rot camera))
(fov (scene-camera-fov camera)))
(declare (type single-float rot fov)
(type vec3 pos))
(gl:matrix-mode :projection)
(gl:load-identity)
(set-perspective fov +sr+ 0.1 24.0)
(gl:matrix-mode :modelview)
(gl:load-identity)
(gl:rotate -90.0 1.0 0.0 0.0)
(gl:rotate rot 0.0 0.0 1.0)
(gl:translate (- (the single-float (vec3-x pos)))
(- (the single-float (vec3-y pos)))
(- (the single-float (vec3-z pos))))
;; this always returns the following:
;; mv = #(1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0)
(format t "mv = ~a~%" (gl:get-float :modelview-matrix))
nil))
いくつかの追加メモ:
- また、何が起こるかを確認するために、 (gl:get-float :modelview-matrix) の印刷出力を別のファイルのコードのはるかに早い段階で、文字通り OpenGL コンテキストが作成された直後に配置しようとしました。いくつかのランダムな回転および変換呼び出し-そして、それはうまく機能し、私が期待していた行列を返しました! ただし、それ以外の場合は単位行列を返します。この関数を例として使用したのは、Lisp に慣れていない読者にとっても最も理解しやすいためです。
- 2001 年初頭のある時点で、OpenGL フォーラムでこの問題を抱えているインターネット上の他の誰かの Google 検索で 1 つのインスタンスしか見つけることができませんでした。 」 みたいな結論。
- 私は固定パイプラインを使用していませんが、最新の OpenGL のベスト プラクティスでは「プログラム可能なパイプラインを実行するときに独自のマトリックスを使用する」ことが推奨されていますが、OpenGL を無効にしたり、OpenGL に関してマトリックス操作機能の一部を無効にしたりすることについては、何も読んだことがありません。プログラマブル パイプラインが使用される場合の独自の行列。ただし、念のため、プログラマブル パイプラインを一時的に無効にするコード内にラップされた get-float 呼び出しも試しましたが、固定パイプライン モードの場合でも恒等行列が返されました。
- これが nvidia OpenGL ドライバーの奇妙なバグではないことを確認するために、Intel グラフィックス ドライバーを使用するラップトップでこの奇妙な異常を再現することができました。同じ結果です。
- これは、gl:get-float のように Lisp 配列を返す代わりに、事前に割り当てられた外部配列に出力をダンプする %gl:get-float-v でも発生します。
- また、上記のコードでは、translate+rotate 呼び出しの後、get-float 呼び出しの前に、gl:finish (glFinish) と gl:flush (glFlush) を以前に試しました。順不同で起こっています。しかし、それらの追加は効果がありませんでした。