0

そのため、この問題について質問する前にここに来ましたが、これまでのところ誰も私の質問に答えることができませんでした. そこで、この問題を説明するビデオを作成しました。

私はこれまでに自分の数学ファイルをチェックして再チェックしました。2 人の大学の教授もそうでした。自分のシェーダーをチェックしました。単純なパススルー シェーダーを使用しているだけです。

問題が発生しているビデオを作成しました。私のプロセスを少し説明します。

ローテーションの初期値を設定しました。これにより、問題が発生するポイントにプッシュされます。

rotX = 0.0f;
rotY = -22.0f;
rotZ = -62.0f;

これらの値により、実行時にオブジェクトを回転させる必要がなくなります。これらの値で問題が発生します。ビデオでわかるように、牛はコードのどこにも実際に指示することなく回転し始めます。回転行列と回転値をログ ファイルに出力しましたが、それらはすべて正常です。

http://www.youtube.com/watch?v=LB7_zftalT8

ですから、これまでどこでも見たことがありません。誰かがこのようなものを見た場合は、私に知らせてください。考えられる問題が非常に多いため、コードを投稿していませんが、必要に応じてコード スニペットを提供したり、ソース svn へのアクセスを提供したりできます。

私はこの問題のデバッグに 3 週間を費やしました。少なくとも 10 組の目でこの問題を見て、私のコードをレビューしてもらいました。

問題として削除できなかった唯一の問題は、メモリの破損です。幸運を祈ります。

編集:

コード サンプル: http://pastebin.com/hRSvEYAZ

回転にはクォータニオンを使用し、軸角度で作成します。次に、ローテーションを複数回組み合わせて、4x4 を作成します。

編集:

MadCoreTom から提供された回答を試しましたが、役に立ちませんでした。また、引き続きメモリを調べましたが、問題は見られません。

編集:

そのため、クォータニオンから正規化呼び出しを削除しました。今は、軸角度からクォータニオンを作成するときにのみ軸を正規化します。また、クォータニオンの toMatrix3 を書き直して、それが役立つかどうかを確認しましたが、そうではありませんでした。

また、ローテーションの更新をキー プレス内に移動しました。すぐにより多くのコードも提供する予定です。

4

2 に答える 2

1

丸め誤差.normalize()が原因で値がわずかに変化する可能性があり、これは牛が狂ってしまうまで増加し続けます。

次のようなものを試して、更新メソッド内のrx代わりに使用できます。rotationX

rx = rotationX.normalized();

ループするたびに値を変更する代わりに。

于 2012-11-27T06:02:20.690 に答える
0

了解しました。問題を解決しました。実際の問題をカバーする浮動小数点エラーがありました。

それで、私がそれを修正したら、MadcoreTomによって提供された方法を使用しませんでした。私がやったことは、軸を正規化することだけであり、回転中にクォータニオンを正規化することはありませんでした。

本当の問題は、角度を保存して蓄積することでした。これが問題の原因でした。

ここで、回転の変化を渡し、軸/角度の変化からクォータニオンを作成してから、これをクォータニオンFに乗算します。

于 2012-11-28T13:54:50.020 に答える