Here is my advice: Don't access position directly. A plane is often simulated by applying forces to the varying plane parts like rudders and wings. For a simplified arcade style feel you can think of the forces as a 'sum' acting on the rigid body as a whole
There are 4 forces on a plane if you take a summed view of things: Weight, thrust, lift, and drag. Drag is always in the opposite direction of velocity, thrust is always in the forward facing direction of the plane, weight is always world down, and lift is pointed in the wings up direction. So to make a plane roll left/right you addRelativeTorque to the plane. Here is my script for a plane and you can make due with what it does, I removed a lot of speed caps and 'constant management' for you to add your own, but this is the 'guts' of it. I added a 5th side slip force for look & feel, and I would urge you to take it out for the time being. There are some things to keep in mind as well such as penalty forces that make the plane nose dive or roll when banking. Note this is a controller for a jet and not really a WW2 plane.
//************************************************************
// Use PhysX rigidbody to update forces acting on a plane
//************************************************************
public void UpdateForces()
{
elapsed += Time.deltaTime;
//************************************************************
// Update Roll & Yaw
//************************************************************
float ax = 0;
float ay = 0;
//************************************************************
// Accelerometer controls, cater to specific situations
//************************************************************
if ( FlightStick.gameObject.active )
{
torqueY = 0.1f * FlightStick.NormalizedX * FlightManager.Data.Handling;
torqueX = 400 * FlightStick.NormalizedY * (1-FlightManager.Data.Stability);
EngineThrust += 25 * ThrustStick.NormalizedY;
if( EngineThrust <= 0 )
{
EngineThrust = 0;
}
else if ( EngineThrust >= MaxThrust )
{
EngineThrust = MaxThrust;
}
}
//************************************************************
//4 Major forces on Plane: Thrust, Lift, Weight, Drag
//************************************************************
Vector3 airSpeedVector = -rigidbody.velocity;
float angleOfAttack = -Mathf.Deg2Rad * Vector3.Dot( rigidbody.velocity, transform.up);
float slipAoA = -Mathf.Deg2Rad * Vector3.Dot( rigidbody.velocity, transform.right);
float speedWeight = AirDensity * ((CurrentSpeed*CurrentSpeed)/2);
float weightCo = Weight;
sideSlipCoefficient = 0.001f * slipAoA * speedWeight;
liftCoefficient = WingArea * angleOfAttack * speedWeight;
//************************************************************
//drag goes from x -> 3x * %
//angle goes from -1 -> 1
//************************************************************
float horizonAngle = Vector3.Dot( transform.forward, Vector3.up);
dragCoefficient = 2*AirDrag + 2 * AirDrag * horizonAngle;
thrustCoefficient = EngineThrust;
AoA = Vector3.Dot( transform.up, Vector3.up);
//************************************************************
// Pitch from lift, yaw & roll from sideslip
//************************************************************
rollCoEfficient = -(torqueY+ay) * RollRate * speedWeight;
pitchCoEfficient = (torqueX+ax) * ElevatorRate * speedWeight;
yawCoEfficient = 0;
pitchCoEfficient += liftCoefficient * 0.001f;
yawCoEfficient += -sideSlipCoefficient * 2f;
rollCoEfficient += -sideSlipCoefficient * 0.1f;
//************************************************************
// Calc vectors now we have coefficients
//************************************************************
WeightVector = Vector3.down * weightCo;
ThrustForceVector = transform.forward * thrustCoefficient;
LiftVector = transform.up * liftCoefficient;
DragVector = airSpeedVector * dragCoefficient;
SideSlip = Vector3.right * sideSlipCoefficient;
RollTorque = Vector3.forward * rollCoEfficient;
YawTorque = Vector3.up * yawCoEfficient;
PitchTorque = Vector3.right * pitchCoEfficient;
//************************************************************
// Apply forces
//************************************************************
rigidbody.AddForce(ThrustForceVector, ForceMode.Force);
rigidbody.AddForce(DragVector, ForceMode.Force);
rigidbody.AddForce(LiftVector, ForceMode.Force);
rigidbody.AddForce(WeightVector, ForceMode.Force);
rigidbody.AddForce(SideSlip, ForceMode.Force);
rigidbody.AddRelativeTorque(RollTorque);
rigidbody.AddRelativeTorque(YawTorque);
rigidbody.AddRelativeTorque(PitchTorque);
//************************************************************
// Instrumentation data & debug output
//************************************************************
VelocityVector = rigidbody.velocity;
PlaneLift = liftCoefficient;
//AoA = angleOfAttack;
RotX = transform.rotation.eulerAngles.x;
RotY = transform.rotation.eulerAngles.y;
RotZ = transform.rotation.eulerAngles.z;
torqueX = 0;
torqueY = 0;
CurrentSpeed = VelocityVector.magnitude;
CurrentFuel -= Time.deltaTime * Weight/5 * EngineThrust/MaxThrust * 0.3f * FuelConsumption;
}
answered
May 19 '11 at 09:28 PM
Jeston
419
●
27
●
31
●
34