17

最初に(それ自体の中心を中心に)回転させてから、それをある点に変換したいオブジェクトがあります。回転を保持する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));

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

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

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

4

1 に答える 1

28

間違った順序で適用しているからです。を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;

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

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

于 2012-03-29T07:33:49.637 に答える