\ We now rotate (xVelocity, yVelocity, zVelocity), using \ matrix 1, into (xVelocityP, yVelocityP, zVelocityP) \ \ In other words, the following code takes the plane's \ velocity vector in (xVelocity, yVelocity, zVelocity), \ rotates it by the plane's orientation and stores the \ result in the (xVelocityP, yVelocityP, zVelocityP) \ vector \ \ The (xVelocity, yVelocity, zVelocity) vector is the \ velocity of the plane with respect to the outside \ world, so yVelocity is the vertical speed of the plane \ (as shown on the vertical speed indicator), which is \ unaffected by how the plane is orientated (a plane \ dropping out of the sky is still dropping out of the \ sky, even when it's tumbling) \ \ The (xVelocityP, yVelocityP, zVelocityP) vector is the \ velocity of the plane with respect to the plane \ itself, so zVelocityP is the forward speed of the \ plane from the point of view of the pilot - it's the \ speed of the air rushing past us as we fly, so this is \ the speed we show on the airspeed indicator \ \ The following code calculates the latter from the \ former by setting point 255 to the speed vector, \ rotating it by the plane's orientation angles, and \ storing the result in the velocity vector LDX #LO(xVelocityHi) \ Set X so the call to CopyWorkToPoint copies the \ coordinates from (xVelocity, yVelocity, zVelocity) LDY #255 \ Set Y so the call to CopyWorkToPoint copies the \ coordinates to point 255 STY GG \ Set GG to point ID 255, to pass to the call to \ SetPointCoords JSR CopyWorkToPoint \ Copy the coordinates from (xVelocity, yVelocity, \ zVelocity) to point 255 LDA #0 \ Set the matrix number so the call to SetPointCoords STA matrixNumber \ uses matrix 1 in the calculation, which will rotate \ the point by the plane's pitch, roll and yaw angles, \ transforming it from the outside world's frame of \ reference to the plane's frame of reference JSR SetPointCoords \ Calculate the coordinates for point 255 LDX #LO(xVelocityPLo) \ Set X so the call to CopyPointToWork copies the \ coordinates to (xVelocityP, yVelocityP, zVelocityP) LDY #255 \ Set Y so the call to CopyPointToWork copies the \ coordinates from point 255 JSR CopyPointToWork \ Copy the coordinates from point 255 to \ (xVelocityP, yVelocityP, zVelocityP) JSR ApplyAerodynamics \ Check for stalling and calculate various aerodynamic \ forces JSR ApplyFlightControl \ Calculate the effects of the primary flight controls \ (elevator, rudder and ailerons), and implement the \ "instant centre" feature JSR ScaleFlightForces \ Scale all the flight forces by the relevant force \ and scale factorsName: ApplyFlightModel (Part 2 of 7) [Show more] Type: Subroutine Category: Flight model Summary: Convert velocity to the plane's perspective and calculate various aerodynamic forces Deep dive: The flight modelContext: See this subroutine in context in the source code References: No direct references to this subroutine in this source file
This part does the following: * Rotate the plane's velocity vector in (xVelocity, yVelocity, zVelocity) to the plane's frame of reference using matrix 1, and store the result in (xVelocityP, yVelocityP, zVelocityP): [ xVelocityP ] [ xVelocity ] [ yVelocityP ] = matrix1 x [ yVelocity ] [ zVelocityP ] [ zVelocity ] * Call the ApplyAerodynamics routine to check for stalling: * If we are already stalling and not going fast enough to pull out of the stall, make the stalling sound and move on. * If we are not already stalling, or we are possibly going fast enough to pull out of the stall (zVelocityPHi >= 11), we perform the stall check: zVelocityP <= |yVelocityP| * 4 If this is true, then we are stalling. * If we have just started stalling (i.e. we weren't already stalling but we are now), check that we are not too close to the ground (so we check that yPlaneLo >= 20), and assuming we aren't, apply a roll to the plane to simulate one of the wings stalling before the other: zTurn = zTurn +/- (A 0) >> 5 where: * The +/- sign is the sign of yTurn * A = xTurnTop EOR #%00111111 * The same routine calculates various aerodynamic forces, as follows: [ xMoments ] = [ yVelocityP * 2 - xTurn * 250 / 256 ] [ yMoments ] = [ xVelocityP * 2 - yTurn * 250 / 256 ] * maxv * [ zMoments ] = [ -zTurn * 2 ] airDensity [ xLiftDrag ] = [ xVelocityP * 2 * 4 ] [ yLiftDrag ] = [ yVelocityP * 2 * 4 ] * maxv * airDensity [ zLiftDrag ] = [ zVelocityP * 2 ] zSlipMoment = xLiftDrag where: airDensity = ~yPlaneHi * 2 maxv = max(|xVelocityP|, |yVelocityP|, |zVelocityP|) If zLiftDrag is positive we also do: yFlapsLift = zLiftDrag xMoments = xMoments + (zLiftDrag * 8) when the flaps are off xMoments - (zLiftDrag * 4) when the flaps are on * Call the ApplyFlightControl routine to calculate the effects of the primary flight controls (elevator, rudder and ailerons), as follows: xControls = zLiftDrag * elevatorPosition (pitch) yControls = zLiftDrag * rudderPosition (yaw) zControls = zLiftDrag * aileronPosition (roll) This routine also implements the "instant centre" feature. * Call the ScaleFlightForces routine to scale all the flight forces by the relevant force and scale factors, as follows: scaledForce = unscaledForce * forceFactor * 2 ^ scaleFactor where the 11 forces are: * (xLiftDrag, yLiftDrag, zLiftDrag) * (xMoments, yMoments, zMoments) * zSlipMoment * yFlapsLift * (xControls, yControls, zControls) The scaled results are stored in xMomentsSc, xLiftDragSc and so on.
[X]
Subroutine ApplyAerodynamics (Part 1 of 3) (category: Flight model)
Set up various variables to use in the aerodynamics calculations
[X]
Subroutine ApplyFlightControl (category: Flight model)
Calculate the effects of the primary flight controls (elevator, rudder and ailerons), and implement the "instant centre" feature
[X]
Subroutine CopyPointToWork (category: Utility routines)
Copy a point from the point tables to the variable workspace
[X]
Subroutine CopyWorkToPoint (category: Utility routines)
Copy a point from the variable workspace to the point tables
[X]
Subroutine ScaleFlightForces (category: Flight model)
Scale the flight forces by the relevant scale factors
[X]
Subroutine SetPointCoords (category: 3D geometry)
Calculate the coordinates for a point
[X]
Variable matrixNumber in workspace Main variable workspace
The matrix used in matrix operations
[X]
Variable xVelocityHi in workspace Main variable workspace
Plane velocity in the x-axis from the perspective of the outside world (high byte)
[X]
Variable xVelocityPLo in workspace Main variable workspace
Plane velocity along the x-axis from the perspective of the pilot (low byte)