ビー玉の回転に問題があります。
で試してみましたが、いくつか問題がMatrix.CreateFromYawPitchRoll
ありました。ジンバルロック効果Matrix.CreateRotation
によるものだと思います。
そのため、代わりにクォータニオンを使用してみましたが、何も変わりませんでした。
軸のみで移動する場合は問題なく動作しますが、回転が 2 つの異なる軸で発生すると、ビー玉は依然として間違った軸で回転します。
これが私のコードです:
// declarations
Vector3 Position = Vector3.Zero;
Vector3 Rotation = Vector3.Zero;
Quaternion qRotation = Quaternion.Identity;
AbsoluteBoneTransforms = new Matrix[Model.Bones.Count];
Model.CopyAbsoluteBoneTransformsTo(AbsoluteBoneTransforms);
Update
メソッド内:
Position += speed;
Rotation = speed * MathHelper.ToRadians(-1.5f);
Quaternion rot = Quaternion.CreateFromAxisAngle(Vector3.Right, Rotation.Z) *
Quaternion.CreateFromAxisAngle(Vector3.Backward, Rotation.X);
qRotation *= rot;
そしてDraw
メソッドで:
effect.World = AbsoluteBoneTransforms[mesh.ParentBone.Index] *
Matrix.CreateFromQuaternion(qRotation) * Matrix.CreateTranslation(Position);
どうしたの?Quaternion.CreateFromAxisAngle
複数の軸で使用するのは間違っていますか?
編集
複数の軸の組み合わせを使用する代わりに、大理石の回転軸を直接計算しようとしました:
angle += speed.Length() * angularVelocity;
qRotation = Quaternion.CreateFromAxisAngle(Vector3.Cross(speed, Vector3.Up), angle);
qRotation.Normalize();
angle
現在の動きを追跡するフロートです。この解決策はジンバル ロック
を作成しないようですが、大理石の回転は正しくありません。回転速度は一定ではないようですが、時間の経過とともに速くなったり遅くなったりしました。理由はわかりません。
クォータニオンを「連結」すると、次を使用してすべてのフレームを取得します
qRotation *= Quaternion.CreateFromAxisAngle(Vector3.Cross(speed, Vector3.Up), angle)
ジンバル ロック効果はまだ表示されます。