web-dev-qa-db-ja.com

glmは回転と平行移動を組み合わせる

最初に(それ自体の中心を中心に)回転させてから、それをある点に平行移動したいオブジェクトがあります。回転を保持するglm :: quatと、変換する必要のあるポイントを保持するglm :: vec3があります。

glm::vec3 position;
glm::quat orientation;
glm::mat4 modelmatrix; <-- want to combine them both in here

modelmatrix = glm::translate(glm::toMat4(orientation),position);

次に、レンダリング機能で行います。

pvm = projectionMatrix*viewMatrix*modelmatrix;
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm));

..そしてレンダリング...

残念ながら、回転を適用すると、オブジェクトは原点の周りを周回するだけです(原点から「位置」が遠いほど、軌道は大きくなります)。

私がポジションだけを申請するとき、それはうまく翻訳されます。回転のみを適用すると、原点に留まり、中心を中心に回転します(予想どおり)。では、両方を適用すると、なぜ奇妙になるのでしょうか。基本的なものが足りませんか?

14
Jubei

間違った順序で適用しているためです。 glm::translate(glm::toMat4(orientation),position)を実行すると、次と同等の処理が実行されます。

glm::mat4 rot = glm::toMat4(orientation);
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position);
glm::mat4 final = rot * trans;

平行移動はマトリックスの左側ではなく右側にあることに注意してください。これは、平行移動が発生することを意味します最初、次に回転が発生します平行移動に対して。したがって、回転は平行移動後に空間で発生します。

回転を発生させたい最初。したがって、行列の乗算の順序を逆にします。

27
Nicol Bolas