11

(VS2010で)glmの使用を開始しているときに、非常に単純なエラーが発生しました。私はこの短いコードを持っています:

glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f));
glm::vec4 vector(1.f,1.f,1.f,0.f);
glm::vec4 transformedVector = translate * vector;

変換されたVector の結果は、元の値 (1.f、1.f、1.f、0.f) と同じです。ここで何が欠けているのかわかりません。回転行列を試してみましたが、うまく機能しています。ポイントは正しく変換されています。

glm::mat4 rotate = glm::rotate(glm::mat4(1.f), 90.f, glm::vec3(0.f, 0.f, 1.f));
glm::vec4 vector(1.f, 1.f, 1.f, 0.f);
glm::vec4 transformedVector = rotate * vector;

わかりました、私は問題を発見しました。ベクトルではなく頂点を変換したいのですが、この場合は w 値を 1 に設定する必要がありました。

4

1 に答える 1

26

射影座標を忘れています。したがって、最後のコンポーネント

glm::vec4 vector

1 にする必要があります。したがって、修正は単純に次のように行います。

glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f));
glm::vec4 vector(1.f,1.f,1.f,1.f);
glm::vec4 transformedVector = translate * vector;

これは、射影座標 (vec4) から w コンポーネントで割った通常の座標 (vec3) を得るために、射影座標が機能する方法によるものです。(ゼロの場合は実行できません。)

回転では機能するが並進では機能しない理由は、射影空間では回転が通常の空間と「同じ」であるが、並進が異なるためです。

あなたがエラーを解決したことに気付きましたが、説明が役立つかもしれないと思いました.

于 2013-09-24T18:04:27.463 に答える