3

自分の行列/ベクトル演算からGLMに移行しましたが、1つ理解できません。

OpenGLのモデル行列 --model_matrix=scale_matrix * rotate_matrix * translate_matrixなので、最初に変換してから回転し、最後にスケールします。しかし、GLMでそうしようとすると、乗算の逆順(平行移動*回転*スケール)を使用した場合にのみ正しい場所にクワッドが表示されますが、MVP行列(投影*ビュー*モデル)では正常に機能します。

サンプルコード

using namespace glm;
mat4 projection = ortho(0.0f, 1.0f, 0.0f, 1.0f);
mat4 translate = translate(mat4(1.0f), vec3(0.5f, 0.5f, 0.0f));
mat4 rotate = rotate(mat4(1.0f), 90.0f, vec3(0.0f, 0.0f, 1.0f));
mat4 scale = scale(mat4(1.0f), vec3(0.5f, 0.5f, 1.0f));
mat4 m = translate * scale * rotate;// must be scale * rotate * translate
mat4 mvp = projection * mat4(1.0f)/*view matrix*/ * m;
glUseProgram(shader->prog);
glUniformMatrix4fv(shader->uniforms[0]/*um_mvp*/, 1, GL_FALSE, value_ptr(mvp));
...

バーテックスシェーダー

attribute vec3 av_pos;
attribute vec2 av_tex;

uniform mat4 um_mvp;

varying vec2 vv_tex;

void main()
{
 vv_tex = av_tex;
 gl_Position = um_mvp * vec4(av_pos, 1.0); 
} 
4

1 に答える 1

14

したがって、最初に平行移動してから回転し、最後に縮尺します。

...まあ、まったく逆です。

「完全な」マトリックスは次のようになります(簡単にするために回転は脇に置いておきます):

proj * view * translate * scale

、 右 ?これは正しいです:これは、ポイントXがこのように変換されることを意味します:

proj * view * translate * scale * X

、つまり、最初に縮尺を適用し、次に平行移動を適用し、次にカメラを基準にして配置し、次に投影を適用します。これは完璧です。

あなたの問題は「翻訳前のスケール」のもののようです。X軸の10の平行移動、2のスケールを想像してください。たとえば、船に行列を適用します。

  • あなたはあなたの船をスケーリングします。あなたは今大きな船を持っていますが、まだ原点にいます
  • あなたはあなたの船を翻訳します。今でも同じくらいの大きさですが、原点の10単位です。

反対の場合:

  • あなたはあなたの船を翻訳します。その中心は現在、原点の10単位にあります
  • あなたはあなたの船をスケーリングします。すべての座標は、遠くにある原点を基準にして2倍されます...したがって、最終的には大きな船になりますが、中心は2 * 10=20になります。これは望ましくありません。

それは理にかなっていますか ?

(出典:opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/

于 2012-10-11T12:41:45.697 に答える