/// <summary>
/// Constructs the front end and the internal physics representation of the vehicle.
/// </summary>
/// <param name="position">Position of the tank.</param>
/// <param name="owningSpace">Space to add the vehicle to.</param>
/// <param name="camera">Camera to attach to the vehicle.</param>
/// <param name="game">Running game.</param>
/// <param name="drawer">Drawer used to draw the tank.</param>
/// <param name="wheelModel">Model to use for the 'wheels' of the tank.</param>
/// <param name="wheelTexture">Texture of the wheels on the tank.</param>
public TankInput(Vector3 position, Space owningSpace, Camera camera, DemosGame game, ModelDrawer drawer, Model wheelModel, Texture2D wheelTexture)
{
var bodies = new List<CompoundShapeEntry>()
{
new CompoundShapeEntry(new BoxShape(4f, 1, 8), new Vector3(0, 0, 0), 500),
new CompoundShapeEntry(new BoxShape(3, .7f, 4f), new Vector3(0, .5f + .35f, .5f), 1)
};
var body = new CompoundBody(bodies, 501);
body.CollisionInformation.LocalPosition = new Vector3(0, .5f, 0);
body.Position = (position); //At first, just keep it out of the way.
Vehicle = new Vehicle(body);
#region RaycastWheelShapes
//The wheel model used is not aligned initially with how a wheel would normally look, so rotate them.
MaximumDriveForce = 1800;
BaseSlidingFriction = 3;
Matrix wheelGraphicRotation = Matrix.CreateFromAxisAngle(Vector3.Forward, MathHelper.PiOver2);
for (int i = 0; i < 6; i++)
{
var toAdd = new Wheel(
new RaycastWheelShape(.375f, wheelGraphicRotation),
new WheelSuspension(2000, 300f, Vector3.Down, 1.3f, new Vector3(-1.9f, 0, -2.9f + i * 1.15f)),
new WheelDrivingMotor(10, MaximumDriveForce, MaximumDriveForce),
new WheelBrake(7, 7, 1.0f),
new WheelSlidingFriction(BaseSlidingFriction, BaseSlidingFriction));
toAdd.DrivingMotor.GripFrictionBlender = FrictionBlender;
toAdd.Brake.FrictionBlender = FrictionBlender;
toAdd.SlidingFriction.FrictionBlender = FrictionBlender;
Vehicle.AddWheel(toAdd);
leftTrack.Add(toAdd);
}
for (int i = 0; i < 6; i++)
{
var toAdd = new Wheel(
new RaycastWheelShape(.375f, wheelGraphicRotation),
new WheelSuspension(2000, 300f, Vector3.Down, 1.3f, new Vector3(1.9f, 0, -2.9f + i * 1.15f)),
new WheelDrivingMotor(10, 2000, 1000),
new WheelBrake(7, 7, 1.0f),
new WheelSlidingFriction(BaseSlidingFriction, BaseSlidingFriction));
toAdd.DrivingMotor.GripFrictionBlender = FrictionBlender;
toAdd.Brake.FrictionBlender = FrictionBlender;
toAdd.SlidingFriction.FrictionBlender = FrictionBlender;
Vehicle.AddWheel(toAdd);
rightTrack.Add(toAdd);
}
#endregion
foreach (Wheel wheel in Vehicle.Wheels)
{
//This is a cosmetic setting that makes it looks like the car doesn't have antilock brakes.
wheel.Shape.FreezeWheelsWhileBraking = true;
//By default, wheels use as many iterations as the space. By lowering it,
//performance can be improved at the cost of a little accuracy.
wheel.Suspension.SolverSettings.MaximumIterationCount = 1;
wheel.Brake.SolverSettings.MaximumIterationCount = 1;
wheel.SlidingFriction.SolverSettings.MaximumIterationCount = 1;
wheel.DrivingMotor.SolverSettings.MaximumIterationCount = 1;
}
Space = owningSpace;
Space.Add(Vehicle);
ModelDrawer = drawer;
DisplayModel model;
WheelModels = new List<DisplayModel>();
for (int k = 0; k < Vehicle.Wheels.Count; k++)
{
Vehicle.Wheels[k].Shape.Detector.Tag = "noDisplayObject";
model = new DisplayModel(wheelModel, ModelDrawer);
ModelDrawer.Add(model);
WheelModels.Add(model);
model.Texture = wheelTexture;
}
CameraControlScheme = new ChaseCameraControlScheme(Vehicle.Body, new Vector3(0, 0.6f, 0), true, 10, camera, game);
}