2012-03-29 21 views
13

私は最初に回転させたいオブジェクトを持っています(それは自分自身の中心です)。そしてそれをある点に翻訳します。私は、回転を保持するglm :: quatと、翻訳が必要なポイントを保持するglm :: vec3を持っています。glm回転と翻訳を組み合わせる

私は私のレンダリング機能...

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

..andレンダリングで次に

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

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

...

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

ポジションのみを適用すると、うまく翻訳されます。回転のみを適用すると、原点にとどまり、中心(予想通り)で回転します。では、なぜ私はそれらを両方とも適用すると変わっていくのですか?私は何か基本的なものを欠いています

答えて

23

誤った順序で適用しているためです。翻訳は行列ではなく、左の右側にあることを

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

注:glm::translate(glm::toMat4(orientation),position)を行うことで、あなたはこの同等のものをやっています。つまり、翻訳がの最初のになると、ローテーションはに対応してとなります。したがって、回転後に回転が起こります。

ローテーションが発生するようにする最初に。したがって、行列の乗算の順序を逆にします。

+0

私はglm :: translateが関数の第1引数に変換を適用するという印象を受けました。ありがとうございました。 – Jubei

+3

@准:マトリックスに翻訳を適用します。それはそれを右に掛けます。つまり、回転が最初に起こるようにするには、翻訳が*最初に行われることを意味します。 –

+0

この回答をお寄せいただきありがとうございます。私は今日これに執着していますが、私が間違っていることを理解したにもかかわらず、機能が動作するはずであることを確認できませんでした。 –

関連する問題