Provides XNA-like quaternion support.
Example #1
0
 public override void ExclusiveUpdate()
 {
     if (Plane.PlanePilot == null)
     {
         return; // Don't fly when there's nobody driving this!
     }
     // TODO: Special case for motion on land: only push forward if W key is pressed? Or maybe apply that rule in general?
     // Collect the plane's relative vectors
     BEPUutilities.Vector3 forward = BEPUutilities.Quaternion.Transform(BEPUutilities.Vector3.UnitY, Entity.Orientation);
     BEPUutilities.Vector3 side = BEPUutilities.Quaternion.Transform(BEPUutilities.Vector3.UnitX, Entity.Orientation);
     BEPUutilities.Vector3 up = BEPUutilities.Quaternion.Transform(BEPUutilities.Vector3.UnitZ, Entity.Orientation);
     // Engines!
     if (Plane.PlanePilot.SprintOrWalk >= 0.0)
     {
         BEPUutilities.Vector3 force = forward * (Plane.PlaneRegularStrength +  Plane.PlaneFastStrength) * Delta;
         entity.ApplyLinearImpulse(ref force);
     }
     double dotforw = BEPUutilities.Vector3.Dot(entity.LinearVelocity, forward);
     entity.ApplyImpulse(side * 5 + entity.Position, up * -Plane.PlanePilot.XMove * entity.Mass * dotforw * 0.5 * Delta);
     entity.ApplyImpulse(forward * 5 + entity.Position, side * ((Plane.PlanePilot.ItemRight ? 1 : 0) + (Plane.PlanePilot.ItemLeft ? -1 : 0)) * entity.Mass * dotforw * 0.5 * Delta);
     entity.ApplyImpulse(forward * 5 + entity.Position, up * Plane.PlanePilot.YMove * entity.Mass * 0.5 * Delta * dotforw);
     // Rotate the entity pre-emptively, and re-apply the movement velocity in this new direction!
     double vellen = entity.LinearVelocity.Length();
     BEPUutilities.Vector3 normvel = entity.LinearVelocity / vellen;
     BEPUutilities.Vector3 norm_vel_transf = BEPUutilities.Quaternion.Transform(normvel, BEPUutilities.Quaternion.Inverse(entity.Orientation)); // Probably just 1,0,0 on whichever axis... can be simplified!
     BEPUutilities.Vector3 inc = entity.AngularVelocity * Delta * 0.5;
     BEPUutilities.Quaternion quat = new BEPUutilities.Quaternion(inc.X, inc.Y, inc.Z, 0);
     quat = quat * entity.Orientation;
     BEPUutilities.Quaternion orient = entity.Orientation;
     BEPUutilities.Quaternion.Add(ref orient, ref quat, out orient);
     orient.Normalize();
     entity.Orientation = orient;
     entity.LinearVelocity = BEPUutilities.Quaternion.Transform(norm_vel_transf, orient) * vellen;
     entity.AngularVelocity *= 0.1;
     // Apply air drag
     Entity.ModifyLinearDamping(Plane.PlanePilot.SprintOrWalk < 0.0 ? 0.6 : 0.1); // TODO: arbitrary constant
     Entity.ModifyAngularDamping(0.5); // TODO: arbitrary constant
     // Ensure we're active if flying!
     Entity.ActivityInformation.Activate();
 }
 public BoneRelationship(Bone bone, Entity entity)
 {
     Bone = bone;
     Entity = entity;
     DisplayBone = null;
     LocalRotationBoneToEntity = Quaternion.Concatenate(entity.Orientation, Quaternion.Conjugate(bone.Orientation));
 }
Example #3
0
 public static UnityEngine.Quaternion FromBEPU(this BEPUutilities.Quaternion quaternion)
 {
     return(new UnityEngine.Quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W));
 }