I want to animate Model1 (an aicraft) and I want an object, Model2 (a sphere), to follow it in translation and rotation, as it is a part of this aircraft.
With the following code (I use one or two tutorials to write it) everything seems good when you just change just one angle at the time. The sphere gently follows the aircraft, but if you change more than one angle at the same time, everything goes wrong.
I wonder if it's not a gimbal lock problem? But I use quaternions? Or maybe I haven't understood all this stuff?
My code is below:
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// Command input to airplane
float yokeUpDown = 0.0f;
float yokeRightLeft = 0.0f;
float RollRotation = 0.01f;
//make quaternion rotation matrix of airplane
Quaternion additionalAircraftRotation = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), yokeUpDown) * Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), yokeRightLeft) *Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), RollRotation);
//increase or decrease aircraft rotation
spacecraftRotation = spacecraftRotation * additionalAircraftRotation;
// make vector3 sphere angle rotation
sphereAngle.X = sphereAngle.X + yokeUpDown;
sphereAngle.Y = sphereAngle.Y + yokeRightLeft;
sphereAngle.Z = sphereAngle.Z + RollRotation;
// make rotation quaternion for sphere
Quaternion additionalSphereRotation = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), sphereAngle.X) * Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), sphereAngle.Y) * Quaternion.CreateFromAxisAngle(new Vector3(1,0, 0), sphereAngle.Z);
//relative position of the sphere to the aircraft
Vector3 translationSphere = new Vector3(-distance_Aircraft_Sphere, 0,0);
translationSphere = Vector3.Transform(translationSphere, additionalSphereRotation);
sphereposition = aircraftposition + translationSphere;
// “VectorToAdd” = direction of the airplane
Vector3 rotatedAircraftVector = Vector3.Transform(vectorToAdd, spacecraftRotation);
aircraftposition += moveSpeedAircraft * rotatedAircraftVector;
sphereposition += moveSpeedAircraft * rotatedAircraftVector;
}
enter code here