1

glm::rotateシーン内の立方体の変換行列を回転させるために使用しています。

"cube->t = glm::rotate(cube->t, stepTime * 50.f, glm::vec3(0.f, 1.f, 0.f));"フレームごとに1回呼び出されます。ここcube->tで、は問題のマトリックスです。

奇妙なことに、20分(またはのstepTime * 5000.f代わりに回転する場合は2分stepTime * 50.f)の間に、立方体はX軸とZ軸で顕著にスケーリングし、これら2つの軸のスケーリングは常に同じです(高さ)立方体のは変化しませんが、幅と深さはまったく同じ量だけ変化します)。の場合は5000.f小さくなり、ノーマル50.fまたはの場合100.fは大きくなります。

これは丸め誤差の問題かもしれないと思いましたが、それ以外は何が原因であるのかわかりません。この丸め誤差ですか?定期的に行列を正規化して解決できますか?glmには行列を正規化する関数がありますか、それとも自分で作成する必要がありますか?

4

2 に答える 2

7

増分、累積、精度の低下である場合:キューブをインプレースで更新する代わりに、元の回転していないキューブを保持し、総回転角を追跡します。次に、各ステップで、元の回転していない立方体から立方体を作成し、累積回転角の合計で変換します。このようにして、キューブは累積的な丸めの問題に悩まされることはありません。

編集:Milesとの話し合いに応じて、より適切な答え:

変換行列の回転成分と並進成分を分離でき、問題が主にせん断またはスケーリングを導入する回転の蓄積にある場合、回転成分から角度を抽出し、回転行列を次のように再作成することで問題を修正できます。その角度ですが、単位の長さです。

于 2012-06-29T21:21:15.977 に答える
0

はい、丸め誤差です。合理的な解決策は、方向を単一の数値として保存し、すべてのフレームでマトリックスを最初から作成することです。

于 2012-06-29T21:20:58.210 に答える