4

私はスカイボックスの実装を始めたばかりで、数学ライブラリとして OpenGL/GLSL と GLM を使用しています。問題は行列に関連していると思いますが、GLM ライブラリを利用する実装を見つけることができませんでした。

スカイボックスのモデルは問題なく読み込まれますが、カメラは 3D 三人称カメラで回転しているかのように円を描きます。

スカイボックス マトリックスについては、カメラが更新されるたびに更新しています。私は glm::lookAt を使用しているため、方向に 0, 0, 0 を使用する以外は基本的にビュー マトリックスと同じ方法で作成されます。

これが私のビューマトリックスの作成です。オブジェクトとジオメトリのレンダリングでうまく機能します:

direction = glm::vec3(cos(anglePitch) * sin(angleYaw), sin(anglePitch), cos(anglePitch) * cos(angleYaw));
right = glm::vec3(sin(angleYaw - 3.14f/2.0f), 0, cos(angleYaw - 3.14f/2.0f));
up = glm::cross(right, direction);
glm::mat4 viewMatrix = glm::lookAt(position, position+direction, up);

同様に、私の空のマトリックスは、1 つの変更だけで同じ方法で作成されます。

glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f);
glm::mat4 skyView = glm::lookAt(position, position + direction, up);

スカイボックスは変換を適用せず、回転のみを考慮することを知っているので、何が問題なのかわかりません。これを行う簡単な方法はありますか?

視覚教材:

まだ何も動かずにまっすぐに プログラムを最初に起動したときはそのまま

カメラを回転させると: ここに画像の説明を入力

私の質問はこれです: glm:lookAt を使用してスカイボックスをレンダリングするための正しいマトリックスを設定するにはどうすればよいですか?

4

1 に答える 1

2

Esthete は正しいです skybox/skydome は、射影行列を変更しないことを意味する唯一のオブジェクトです !!!

レンダリングは次のようになります。

  1. クリアスクリーン/バッファ
  2. カメラを設定
  3. モデルビューをIDに設定し、それをカメラの位置に変換します。射影行列から直接位置を取得できます(私のメモリが配列位置12、13、14で機能する場合)行列を取得するには、これを参照してください https://stackoverflow.com/a /18039707/2521214
  4. スカイボックス/スカイドームを描画します (z_far 平面を横切らないか、深度テストを無効にします)
  5. オプションで Z バッファをクリアするか、深度テストを再度有効にします
  6. シーンを描画します .... (描画されたモデルごとにモデルビュー マトリックスを設定することを忘れないでください)

もちろん、一時的にカメラの位置 (射影行列) を (0,0,0) に設定し、モデルビューの行列を ID のままにしておくこともできます。より正確なアプローチになる場合もありますが、スカイボックスの描画後にカメラの位置を元に戻すことを忘れないでください。

それが役に立てば幸い。

于 2013-08-05T15:09:50.277 に答える