1

誰かが次の行が何をするのか説明してもらえますか?

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);
angle = (GLfloat) (i % 360);
glm::mat4 View = glm::mat4(1.);
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));
glm::mat4 Model = glm::mat4(1.0);
glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE, glm::value_ptr(MVP));

単位をピクセルに変換しますが、それが何をするものかはわかりません。私が持っているもう 1 つの質問は、より一般的なものですが、数値、つまり sin(90) = 1 を 10 ピクセル、または 40 または任意の数値で表現するにはどうすればよいですか? また、(0,0) が画面の中央になるように指定するにはどうすればよいですか? 上記はすべて glm ライブラリによって処理されていますか?

4

2 に答える 2

7

最初の行は、gluPerspective(45.0f, 1.0f, 0.1f, 100.0f) を呼び出すのと同じ透視投影を作成します。gluPerspective の機能がわからない場合は、このリンクを確認してください

 glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);

次の行は、投影角度が 360 度未満であることを確認するために、回転角度を 360 にモジュロします。

angle = (GLfloat) (i % 360);

次の数行は、ビュー マトリックスを定義します。これは基本的にカメラのビューポート、つまりモニターに表示されるものです。移動関数呼び出しと回転関数呼び出しは、カメラを所定の位置に移動するための変換関数呼び出しです

glm::mat4 View = glm::mat4(1.);
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));

次の行は、モデルの位置を定義します。この場合、(1.0f, 1.0f, 1.0f, 1.0f) になります。なぜ 3 つではなく 4 つのパラメーターがあるのか​​ 疑問に思う場合は、OpenGL オレンジ ブックを読むか、同次座標に関するウィキペディアを確認してください。

glm::mat4 Model = glm::mat4(1.0);

最後の 2 行は、モデル ビューの射影行列を計算し、それを OpenGL に渡すことで、シーンの設定を終了します。

glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE,     glm::value_ptr(MVP));

全体として、コード ブロックが行うことは、モデル座標からビュー座標への変換から OpenGL の描画パイプラインをシミュレートすることです。

あなたが尋ねる2番目の質問について。最初の部分がわかりません。数値をピクセルに変換するとはどういう意味ですか? 1D マトリックスのポイントを 2D マトリックスにマップしようとしていますか? その場合は、pixel[index/rows][index%rows] のような標準マッピングを行うだけです。ここで、pixel は画面ピクセル オブジェクト、index は配列インデックス、row は画面の幅です。2番目の部分((0,0)を画面の中央に設定する方法)については、OpenGLが左手座標系、画面の原点を使用するため、画面の原点にオフセットを追加するだけでよいと思いますつまり、(0,0) ポイントは画面の左下になります。したがって、システムを画面の中央に配置したい場合は、(-width/2, -height/2) のオフセットを追加してポイントを OpenGL 空間に変換するか、(width/2, height/2) をその逆に変換します。投影。

于 2011-11-04T19:01:41.703 に答える
0

パースペクティブ カメラ変換をセットアップします。

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);

カメラを Z 軸に沿って少し下に移動します。

View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f));

X 軸を中心にカメラを後方に回転させる:

View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));

X 軸の半分の速さで Y 軸と Z 軸を中心にカメラを回転させる:

View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));
于 2011-11-04T18:29:59.550 に答える