void MIG15_Setup (AirStrucPtr const ControlledAC, ULong Version) { ClassPtr data = ControlledAC->classtype; PMODEL pModel = ControlledAC->fly.pModel; Model& Model = *ControlledAC->fly.pModel; AircraftAnimData* adptr = (AircraftAnimData* )ControlledAC->Anim; switch (Version) { case 1: Model.Type = AT_MIG15; break; case 2: Model.Type = AT_MIG15BIS; break; } SWord CoG = -388;//484; //Max 388 (Wing 26%MAC) PMAINPLANE pMainPlane = new MAINPLANE (pModel, 71000, 240, 390, 32000, 190, 220); pMainPlane->SetPosition(125, 0, -330-CoG, 370, -15, -510-CoG); pMainPlane->SetOrientation (0.75, 0, -3, 0.75, 0, -3); //IGNORE SWEEP pMainPlane->SetMaskAngle(0, 0, 0, 0);//-0.534, -0.666, 50, 50);// pMainPlane->SetDragPolar (0.0175, 0.0825); pMainPlane->SetCurves ("MIG15", "Cl", "Cd", "CompCd0", "CompK", "Cm"); pMainPlane->dCMdq = 0;//-0.01;// pMainPlane->dCMdp = 0; pMainPlane->dCMdr = 0; pMainPlane->buffetAoa0 = Degs2Rads(13); pMainPlane->buffetAoa1 = Degs2Rads(17.5); pMainPlane->buffetM0 = 0.8; pMainPlane->buffetM1 = 1.0; pMainPlane->ACMmaxaoa = Degs2Rads(15); PSURFACE pTailPlane1 = new SURFACE (pModel, ST_PLANE, SD_TAILPLANE, 15000);//, 110); pTailPlane1->SetPosition (55, 175, -875-CoG); pTailPlane1->SetOrientation (0, 0, 0); pTailPlane1->SetMaskAngle(0, 0);//-0.675, 50);// pTailPlane1->SetCurves ("MIG15", "TailCl", "COMM", "TailCd");//, "", "", "COMM", "CompK"); PSURFACE pTailPlane2 = new SURFACE (pModel, ST_PLANE, SD_TAILPLANE, 15000);//, 110); pTailPlane2->SetPosition (-55, 175, -875-CoG); pTailPlane2->SetOrientation (0, 0, 0); pTailPlane2->SetMaskAngle(0, 0);//0.675, 50);// pTailPlane2->SetCurves ("MIG15", "TailCl", "COMM", "TailCd");//, "", "", "COMM", "CompK"); PSURFACE pFin = new SURFACE (pModel, ST_PLANE, SD_FIN, 40000);//40000);//, 260); pFin->SetPosition (0, 100, -730-CoG); pFin->SetOrientation (0, 0, -90); pFin->SetMaskAngle(0, 0);//-0.207, 50);//-0.1, 100);// pFin->SetCurves ("MIG15", "FinCl", "COMM", "TailCd");//, "", "", "COMM", "CompK"); PCYLINDER pCylinder1 = new CYLINDER (pModel, 275, 135, 145); pCylinder1->SetPosition(0, 0, -135-CoG); pCylinder1->SetOrientation (0, 0, 0); PCYLINDER pCylinder2 = new CYLINDER (pModel, 275, 145, 145); pCylinder2->SetPosition(0, 0, -410-CoG); pCylinder2->SetOrientation (0, 0, 0); PCYLINDER pCylinder3 = new CYLINDER (pModel, 275, 115, 115); pCylinder3->SetPosition(0, 0, -685-CoG); pCylinder3->SetOrientation (0, 0, 0); new NEWCTRL (pMainPlane, &Model.Aileron, 17.5, Degs2Rads(15), Degs2Rads(15) ); new NEWCTRL (pTailPlane1, &Model.Elevator, 30, Degs2Rads(16), Degs2Rads(32) ); new NEWCTRL (pTailPlane2, &Model.Elevator, 30, Degs2Rads(16), Degs2Rads(32) ); new NEWCTRL (pFin, &Model.Rudder, 25, Degs2Rads(20), Degs2Rads(20) ); Model.MControlLoss0 = 0.3; Model.MControlLoss1 = 0.9; new AERODEVICE (ControlledAC,pModel, AeroDevice::DT_FLAPS, 0.5, 0.15, -0.25, DEGS2RADS(2.5), 256, FLAPSUPDOWN, &adptr->acflaps);//RJS 14May98 new AERODEVICE (ControlledAC,pModel, AeroDevice::DT_SPEEDBRAKES, 0, 0.05, 0, 0, 256, SPEEDBRAKE, &adptr->acbreak);//RJS 14May98 new AERODEVICE (ControlledAC,pModel, AeroDevice::DT_GEAR, -0.1, 0.04, -0.01, 0, /*35*/128, GEARUPDOWN, NULL, 0); PENGINE pEngine; switch (Version) { case 1: pEngine = new ENGINE (pModel, ET_JET, 22269, 11500, 0.00000005, _CurveRsc.FindCurve ("MIG15", "JetMachFact"), _CurveRsc.FindCurve ("F86E", "JetThrustRpm"), _CurveRsc.FindCurve ("F86E", "JetWindMillDrag"), _CurveRsc.FindCurve ("F86E", "JetWindMillRpm")); break; case 2: pEngine = new ENGINE (pModel, ET_JET, 26476, 11500, 0.00000005, _CurveRsc.FindCurve ("MIG15", "JetMachFact"), _CurveRsc.FindCurve ("F86E", "JetThrustRpm"), _CurveRsc.FindCurve ("F86E", "JetWindMillDrag"), _CurveRsc.FindCurve ("F86E", "JetWindMillRpm")); break; } PTHRUSTPOINT pThrust = new THRUSTPOINT (pModel, TT_JET, 0, 0, -1110-CoG, 0,0); pThrust->SetEngine (pEngine); pEngine->SetThrustPoint (pThrust); Coords3D w,c1,c2; FCRD CG; //Relative to the centre of the shape CG.x = Model.ShapeCoG.x; CG.y = Model.ShapeCoG.y; CG.z = Model.ShapeCoG.z; SHAPE.GetContactPoint(ControlledAC, CT_EYE, w, c1, c2); Model.PilotEyePos.x = c1.X - CG.x; Model.PilotEyePos.y = c1.Y - CG.y; Model.PilotEyePos.z = c1.Z - CG.z; SHAPE.GetContactPoint(ControlledAC, CT_WHLFRONT, w, c1, c2); PGEAR pNose = new GEAR (pModel, NOSE); pNose->SetDimensions (c1.X - CG.x, c1.Y - CG.y, c1.Z - CG.z, c2.X - CG.x, c2.Y - CG.y, c2.Z - CG.z); pNose->SetSuspension (15000, 100000); pNose->SetTyres (0.02, 1, 0); SHAPE.GetContactPoint(ControlledAC, CT_WHLLEFT, w, c1, c2); PGEAR pMainPort = new GEAR (pModel, PORT); pMainPort->SetDimensions (c1.X - CG.x, c1.Y - CG.y, c1.Z - CG.z, c2.X - CG.x, c2.Y - CG.y, c2.Z - CG.z); pMainPort->SetSuspension (55000, 500000); pMainPort->SetTyres (0.02, 1, 12500); SHAPE.GetContactPoint(ControlledAC, CT_WHLRIGHT, w, c1, c2); PGEAR pMainStbd = new GEAR (pModel, STBD); pMainStbd->SetDimensions (c1.X - CG.x, c1.Y - CG.y, c1.Z - CG.z, c2.X - CG.x, c2.Y - CG.y, c2.Z - CG.z); pMainStbd->SetSuspension (55000, 500000); pMainStbd->SetTyres (0.02, 1, 12500); SHAPE.GetContactPoint(ControlledAC, CT_BACK, w, c1, c2); //FAKE GEAR TO STOP TAIL HITTING GROUND PGEAR pTail = new GEAR (pModel, TAIL); pTail->SetDimensions (c1.X - CG.x, c1.Y - CG.y - 10, c1.Z - CG.z, c2.X - CG.x, c2.Y - CG.y, c2.Z - CG.z); pTail->SetSuspension (100000, 100000); pTail->SetTyres (0.1, 1, 0); pModel->SetMassInertias (ControlledAC, 7862, 10539, 4675); Model.MaxG = 9; Model.MinG = -5; Model.ControlForce = 100; // Relative amount of force feedback Model.BuffetForce = 100; Model.PowerBoost = (FP)1.25; Model.ContrailDuration = 1.0; new MODELANIM (ControlledAC,MA_SURFACE, pModel, &ControlledAC->fly.aileron, &adptr->acaileronr);//RJS 14May98 new MODELANIM (ControlledAC,MA_SURFACE, pModel, &ControlledAC->fly.aileron, &adptr->acaileronl, 32767,-32768);//RJS 14May98 new MODELANIM (ControlledAC,MA_SURFACE, pModel, &ControlledAC->fly.elevator, &adptr->acelevator, 32767,-32768);//RJS 14May98 new MODELANIM (ControlledAC,MA_SURFACE, pModel, &ControlledAC->fly.rudder, &adptr->acrudder);//RJS 14May98 new MODELANIM (ControlledAC,MA_SUSPENSION, pNose, &adptr->aclegsuspf, 0, 255); new MODELANIM (ControlledAC,MA_SUSPENSION, pMainPort, &adptr->aclegsuspl, 0, 255); new MODELANIM (ControlledAC,MA_SUSPENSION, pMainStbd, &adptr->aclegsuspr, 0, 255); Mig15_SetupAI(ControlledAC, Version); }
//컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴 //Procedure DerivativeBase //Author Andrew McRae //Date Tue 17 Jun 1997 // //Description Used to calibrate model with linearized // stability derivatives // // This model is aerodynamically accurate // for small disturbances from level flight. // //Inputs // //Returns // //------------------------------------------------------------------------------ void Model::DerivativeBase () { /* Stability Derivatives Forces X,Y,Z Moments L,M,N Velocity u,v,w Angular Velocity p,q,r Roll, Pitch, Yaw inputs a,b,c Downward Acceleration wd (za) (r = density) (everything has 0.5) Forces Moments Forward Stbd Down Roll Pitch Yaw Xu rVS Yu ... Zu rVS Lu ... Mu rVSc Nu ... Xv ... Yv rVS Zv ... Lv rVSb Mv ... Nv rVSb Xw rVS Yw ... Zw rVS Lw ... Mw rVSc Nw ... Xp ... Yp rVSb Zp ... Lp rVSb2 Mp ... Np rVSb2 Xq rVSc Yq ... Zq rVSc Lq ... Mq rVSc2 Nq ... Xr ... Yr rVSb Zr ... Lr rVSb2 Mr ... Nr rVSb2 Xa ... Ya rV2S Za ... La rV2Sb Ma ... Na rV2Sb Xb rV2S Yb ... Zb rV2S Lb ... Mb rV2Sc Nb ... Xc ... Yc rV2S Zc ... Lc rV2Sb Mc ... Nc rV2Sb Xwd rSc Ywd ... Zwd rSc Lwd ... Mwd rSc2 Nwd ... */ typedef struct vel { FP u,v,w; } VEL; typedef struct rotvel { FP p,q,r; } ROTVEL; typedef struct ctrl { FP a,b,c; } CTRL; typedef struct acc { FP ud,vd,wd; } ACC; typedef struct veldervs { VEL X,Y,Z,L,M,N; } VELDERVS; typedef struct rotveldervs { ROTVEL X,Y,Z,L,M,N; } ROTVELDERVS; typedef struct ctrldervs { CTRL X,Y,Z,L,M,N; } CTRLDERVS; typedef struct accdervs { ACC X,Y,Z,L,M,N; } ACCDERVS; VELDERVS V; ROTVELDERVS RV; CTRLDERVS C; ACCDERVS A; //DeadCode AMM 24Nov99 MODEL_DT = 3; MODEL_LOOPS = 1; static Bool setup = TRUE; FP testalpha = -Degs2Rads ((FP)Elevator / 3000); if (testalpha > DEGS2RADS(10)) testalpha = DEGS2RADS(10); if (testalpha < DEGS2RADS(-10)) testalpha = DEGS2RADS(-10); if (setup) { // temp Pos.y = FT_3000; Vel.x = 0; Vel.y = 0; Vel.z = 150; Ori.x.x = 1; Ori.x.y = 0; Ori.x.z = 0; Ori.y.x = 0; Ori.y.y = 1; Ori.y.z = 0; Ori.z.x = 0; Ori.z.y = 0; Ori.z.z = 1; // RotOriXVec (Ori, testalpha); // RotOriXVec (Ori, DEGS2RADS(5)); RotOriYVec (Ori, DEGS2RADS(10)); RotVel.x = 0; RotVel.y = 0; RotVel.z = 0; RotVel.y = 0.00105; // 1 rpm RotVel.z = -0.00105; // temp end setup = FALSE; } // UpdateAirStruc (); Sky.Ambient (Pos.y, AmbDensity, AmbTemp, AmbPres); CalcAirVel (); GearTouched = FALSE; // Set Mass and Rot Inertia Mass = 0; NullVec (RotInertia); PMODEL pModel = ControlledAC->fly.pModel; PMASSPOINT pMass = MassList; while (pMass != NULL) { pMass->Process (pModel); pMass = pMass->List.NextItem (); } // ProcessEngines (); Mass = 617415; RotInertia.x = 1.49534e10; RotInertia.y = 3.59877e10; RotInertia.z = 4.98958e10; // WORK IN STANDARD UNITS // Calc Derivative Mutipliers FP B = (MainPlaneList->Area / MainPlaneList->Chord) * 0.01; FP Ch = MainPlaneList->Chord * 0.01; FP rS = 0.5 * (AmbDensity * 10000) * (MainPlaneList->Area * 0.0001); FP rVS = rS * AirSpeed; FP rVSb = rVS * B; FP rVSc = rVS * Ch; FP rVSb2 = rVSb * B; FP rVSc2 = rVSc * Ch; FP rV2S = rVS * AirSpeed; FP rV2Sb = rV2S * B; FP rV2Sc = rV2S * Ch; FP rSc = rS * Ch; FP rSc2 = rSc * Ch; // Get derivative inputs // Velocities FP u = -AirVel.z; FP v = -AirVel.x; FP w = AirVel.y; // Rotational velocities FP p = RotVel.z * 100; FP q = RotVel.x * 100; FP r = -RotVel.y * 100; // Calc Control inputs FP a = -((FP)Aileron * F2PIE * 20) / (32768 * 360); FP b = ((FP)Elevator * F2PIE * 20) / (32768 * 360); FP c = -((FP)Rudder * F2PIE * 20) / (32768 * 360); // Acceleration FP ud = 0; FP vd = 0; FP wd = 0; // Calc alpha FP alpha = CalcAngle (VecLen2D (u,v), w); if (alpha > DEGS2RADS(180)) alpha -= DEGS2RADS(360); alpha += DEGS2RADS (3); // alpha = testalpha; // if (alpha > DEGS2RADS(10)) alpha = DEGS2RADS(10); // if (alpha < DEGS2RADS(-10)) alpha = DEGS2RADS(-10); FP Sin = FSin (alpha); FP Cos = FCos (alpha); // Calc Cl, Cd FP Cl = alpha * 5.27; FP Cd = alpha * 0.29; #ifdef PRINT_DERV_DATA PrintVar (30, 16, "alp %.2f ", Rads2Degs(alpha)); PrintVar (45, 16, "Cl %.2f ", Cl); PrintVar (60, 16, "Cd %.2f ", Cd); PrintVar (30, 18, "u %.4f ", u); PrintVar (45, 18, "v %.4f ", v); PrintVar (60, 18, "w %.4f ", w); PrintVar (30, 19, "p %.4f ", p); PrintVar (45, 19, "q %.4f ", q); PrintVar (60, 19, "r %.4f ", r); #endif // Force Velocity dervs V.X.u = -Cd * u * rVS; V.Y.u = 0 * u * rVS; V.Z.u = -Cl * u * rVS; V.X.v = 0 * v * rVS; V.Y.v = -0.546 * v * rVS; V.Z.v = 0 * v * rVS; V.X.w = Cl * w * rVS; V.Y.w = 0 * w * rVS; V.Z.w = -Cd * w * rVS; // Moment Velocity dervs V.L.u = 0 * u * rVSb; V.M.u = 0 * u * rVSc; V.N.u = 0 * u * rVSb; V.L.v = -0.0654 * v * rVSb; V.M.v = 0 * v * rVSc; V.N.v = 0.118 * v * rVSb; V.L.w = 0 * w * rVSb; V.M.w = -0.44 * w * rVSc; V.N.w = 0 * w * rVSb; // ***************** // * V.M.w is iffy * // ***************** // Force RotVel dervs RV.X.p = 0; RV.Y.p = 0 * p * rVSb; RV.Z.p = 0; RV.X.q = 0 * q * rVSc; RV.Y.q = 0; RV.Z.q = 0 * q * rVSc; RV.X.r = 0; RV.Y.r = 0.1435 * r * rVSb; RV.Z.r = 0; // Moment RotVel dervs RV.L.p = -0.195 * p * rVSb2; RV.M.p = 0; RV.N.p = -0.008 * p * rVSb2; RV.L.q = 0; RV.M.q = -0.032 * q * rVSc2; RV.N.q = 0; RV.L.r = 0.0575 * r * rVSb2; RV.M.r = 0; RV.N.r = -0.067 * r * rVSb2; // Check M.q (c/2U ?????) // Force Control dervs C.X.a = 0; C.Y.a = 0 * a * rV2S; C.Z.a = 0; C.X.b = 0.43 * Sin * b * rV2S; C.Y.b = 0; C.Z.b = 0.43 * b * Cos * rV2S; C.X.c = 0; C.Y.c = 0.149 * c * rV2S; C.Z.c = 0; // Moment Control dervs C.L.a = -0.114 * a * rV2Sb; C.M.a = 0; C.N.a = 0.009 * a * rV2Sb; C.L.b = 0; C.M.b = -0.934 * b * rV2Sc; C.N.b = 0; C.L.c = 0.0057 * c * rV2Sb; C.M.c = 0; C.N.c = -0.069 * c * rV2Sb; // Z Acc dervs // use Cm alpha dot in F94A derv tables #ifdef PRINT_DERV_DATA PrintVar (30, 0, "V.X.u %.0f ", V.X.u); PrintVar (45, 0, "V.Y.u %.0f ", V.Y.u); PrintVar (60, 0, "V.Z.u %.0f ", V.Z.u); PrintVar (30, 1, "V.X.v %.0f ", V.X.v); PrintVar (45, 1, "V.Y.v %.0f ", V.Y.v); PrintVar (60, 1, "V.Z.v %.0f ", V.Z.v); PrintVar (30, 2, "V.X.w %.0f ", V.X.w); PrintVar (45, 2, "V.Y.w %.0f ", V.Y.w); PrintVar (60, 2, "V.Z.w %.0f ", V.Z.w); PrintVar (30, 4, "V.L.u %.0f ", V.L.u); PrintVar (45, 4, "V.M.u %.0f ", V.M.u); PrintVar (60, 4, "V.N.u %.0f ", V.N.u); PrintVar (30, 5, "V.L.v %.0f ", V.L.v); PrintVar (45, 5, "V.M.v %.0f ", V.M.v); PrintVar (60, 5, "V.N.v %.0f ", V.N.v); PrintVar (30, 6, "V.L.w %.0f ", V.L.w); PrintVar (45, 6, "V.M.w %.0f ", V.M.w); PrintVar (60, 6, "V.N.w %.0f ", V.N.w); PrintVar (30, 8, "RV.X.p %.0f ", RV.X.p); PrintVar (45, 8, "RV.Y.p %.0f ", RV.Y.p); PrintVar (60, 8, "RV.Z.p %.0f ", RV.Z.p); PrintVar (30, 9, "RV.X.q %.0f ", RV.X.q); PrintVar (45, 9, "RV.Y.q %.0f ", RV.Y.q); PrintVar (60, 9, "RV.Z.q %.0f ", RV.Z.q); PrintVar (30, 10, "RV.X.r %.0f ", RV.X.r); PrintVar (45, 10, "RV.Y.r %.0f ", RV.Y.r); PrintVar (60, 10, "RV.Z.r %.0f ", RV.Z.r); PrintVar (30, 12, "RV.L.p %.0f ", RV.L.p); PrintVar (45, 12, "RV.M.p %.0f ", RV.M.p); PrintVar (60, 12, "RV.N.p %.0f ", RV.N.p); PrintVar (30, 13, "RV.L.q %.0f ", RV.L.q); PrintVar (45, 13, "RV.M.q %.0f ", RV.M.q); PrintVar (60, 13, "RV.N.q %.0f ", RV.N.q); PrintVar (30, 14, "RV.L.r %.0f ", RV.L.r); PrintVar (45, 14, "RV.M.r %.0f ", RV.M.r); PrintVar (60, 14, "RV.N.r %.0f ", RV.N.r); #endif // calc forces FCRD force; force.x = V.X.u + V.X.v + V.X.w + RV.X.p + RV.X.q + RV.X.r + C.X.a + C.X.b + C.X.c; force.y = V.Y.u + V.Y.v + V.Y.w + RV.Y.p + RV.Y.q + RV.Y.r + C.Y.a + C.Y.b + C.Y.c; force.z = V.Z.u + V.Z.v + V.Z.w + RV.Z.p + RV.Z.q + RV.Z.r + C.Z.a + C.Z.b + C.Z.c; NettForce.x = force.y; NettForce.y = -force.z; NettForce.z = force.x; // calc moments FCRD moment; moment.x = V.L.u + V.L.v + V.L.w + RV.L.p + RV.L.q + RV.L.r + C.L.a + C.L.b + C.L.c; moment.y = V.M.u + V.M.v + V.M.w + RV.M.p + RV.M.q + RV.M.r + C.M.a + C.M.b + C.M.c; moment.z = V.N.u + V.N.v + V.N.w + RV.N.p + RV.N.q + RV.N.r + C.N.a + C.N.b + C.N.c; NettMoment.x = moment.y * 100; NettMoment.y = -moment.z * 100; NettMoment.z = moment.x * 100; // Engines PTHRUSTPOINT pThrust = ThrustList; while (pThrust != NULL) { pThrust->Process (); NettForce.x += pThrust->Force.x; NettForce.y += pThrust->Force.y; NettForce.z += pThrust->Force.z; pThrust = pThrust->List.NextItem (); } MODLIMIT (NettForce.x, 600000); MODLIMIT (NettForce.y, 2500000); MODLIMIT (NettForce.z, 600000); MODLIMIT (NettMoment.x, 250000000); MODLIMIT (NettMoment.y, 250000000); MODLIMIT (NettMoment.z, 250000000); CalcAcc (); //TempCode ARM 15Jul97 { //TempCode ARM 15Jul97 OldAcc.x = Acc.x; //TempCode ARM 15Jul97 OldAcc.y = Acc.y; //TempCode ARM 15Jul97 OldAcc.z = Acc.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 Acc.x = (NettForce.x / Mass); //TempCode ARM 15Jul97 Acc.y = (NettForce.y / Mass); //TempCode ARM 15Jul97 Acc.z = (NettForce.z / Mass); //TempCode ARM 15Jul97 } CalcRotAcc (); //TempCode ARM 15Jul97 { //TempCode ARM 15Jul97 OldRotAcc.x = RotAcc.x; //TempCode ARM 15Jul97 OldRotAcc.y = RotAcc.y; //TempCode ARM 15Jul97 OldRotAcc.z = RotAcc.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 RotAcc.x = (NettMoment.x / RotInertia.x); //TempCode ARM 15Jul97 RotAcc.y = (NettMoment.y / RotInertia.y); //TempCode ARM 15Jul97 RotAcc.z = (NettMoment.z / RotInertia.z); //TempCode ARM 15Jul97 } TransInt (ALL); //TempCode ARM 15Jul97 { //TempCode ARM 15Jul97 FCRD acc; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 acc.x = (OldAcc.x + Acc.x) * 0.5; //TempCode ARM 15Jul97 acc.y = (OldAcc.y + Acc.y) * 0.5; //TempCode ARM 15Jul97 acc.z = (OldAcc.z + Acc.z) * 0.5; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 TnsPnt (acc, acc, Ori); //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 OldVel.x = Vel.x; //TempCode ARM 15Jul97 OldVel.y = Vel.y; //TempCode ARM 15Jul97 OldVel.z = Vel.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 Vel.x += acc.x * MODEL_DT; //TempCode ARM 15Jul97 Vel.y += (acc.y - GRAVITY) * MODEL_DT; //TempCode ARM 15Jul97 Vel.z += acc.z * MODEL_DT; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 OldPos.x = Pos.x; //TempCode ARM 15Jul97 OldPos.y = Pos.y; //TempCode ARM 15Jul97 OldPos.z = Pos.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 Pos.x += ((OldVel.x + Vel.x) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 Pos.y += ((OldVel.y + Vel.y) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 Pos.z += ((OldVel.z + Vel.z) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 } RotInt (ALL); //TempCode ARM 15Jul97 { //TempCode ARM 15Jul97 OldRotVel.x = RotVel.x; //TempCode ARM 15Jul97 OldRotVel.y = RotVel.y; //TempCode ARM 15Jul97 OldRotVel.z = RotVel.z; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 RotVel.x += ((OldRotAcc.x + RotAcc.x) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 RotVel.y += ((OldRotAcc.y + RotAcc.y) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 RotVel.z += ((OldRotAcc.z + RotAcc.z) * MODEL_DT) * 0.5; //TempCode ARM 15Jul97 //TempCode ARM 15Jul97 RotVelInt (); //TempCode ARM 15Jul97 } // UpdateAirStruc (); // Ground (); // Instruments (ControlledAC); }
void YAK9_Setup (AirStrucPtr const ControlledAC, ULong Version) { ClassPtr data = ControlledAC->classtype; PMODEL pModel = ControlledAC->fly.pModel; Model& Model = *ControlledAC->fly.pModel; AircraftAnimData* adptr = (AircraftAnimData* )ControlledAC->Anim; Model.Type = AT_YAK9; FP CoG = -352;//26%MAC PTHRUSTPOINT pThrust = new THRUSTPOINT (pModel, TT_PROP, 0, 0, -45-CoG, 0, 0); PMAINPLANE pMainPlane = new MAINPLANE (pModel, 45750, 230, 345, 40000, 165, 215); pMainPlane->SetPosition(140, -45, -350-CoG, 430, -20, -350-CoG); pMainPlane->SetOrientation (1, 0, 5, 1, 0, 5); pMainPlane->SetMaskAngle(0, 0, 0, 0);//-0.865, -1.089);// pMainPlane->SetDragPolar (0.0163, 0.0724); pMainPlane->SetCurves ("F80C", "Cl", "Cd", "CompCd0", "CompK", "Cm"); //DeadCode AMM 29Jun99 pMainPlane->StallAoa = Degs2Rads(0);//22.5); //DeadCode AMM 29Jun99 pMainPlane->UnStallAoa = Degs2Rads(12.5); pMainPlane->dCMdq = 0; pMainPlane->dCMdp = 0; pMainPlane->dCMdr = -1; pMainPlane->SetSlipstream(pThrust, 50); pMainPlane->buffetAoa0 = Degs2Rads(15); pMainPlane->buffetAoa1 = Degs2Rads(20); pMainPlane->buffetM0 = 0.95; pMainPlane->buffetM1 = 1.05; pMainPlane->ACMmaxaoa = Degs2Rads(17.5); PSURFACE pTailPlane1 = new SURFACE (pModel, ST_PLANE, SD_TAILPLANE, 19000);//, 95); pTailPlane1->SetPosition (75, 30, -825-CoG); pTailPlane1->SetOrientation (0, 0, 0); pTailPlane1->SetMaskAngle(0, 0); pTailPlane1->SetCurves ("P51D", "TailCl", "COMM", "TailCd");//, "", "", "COMM", "CompK"); pTailPlane1->SetSlipstream(pThrust, 50);//84); PSURFACE pTailPlane2 = new SURFACE (pModel, ST_PLANE, SD_TAILPLANE, 19000);//, 95); pTailPlane2->SetPosition (-75, 30, -825-CoG); pTailPlane2->SetOrientation (0, 0, 0); pTailPlane2->SetMaskAngle(0, 0); pTailPlane2->SetCurves ("P51D", "TailCl", "COMM", "TailCd");//, "", "", "COMM", "CompK"); pTailPlane2->SetSlipstream(pThrust, 50);//84); PSURFACE pFin = new SURFACE (pModel, ST_PLANE, SD_FIN, 20800);//, 135); pFin->SetPosition (0, 80, -875-CoG); pFin->SetOrientation (0, 0, -90); pFin->SetMaskAngle(0, 0);//-0.153); pFin->SetCurves ("P51D", "FinCl", "COMM", "TailCd");//, "", "", "COMM", "CompK"); pFin->SetSlipstream(pThrust, 50);//90); PCYLINDER pCylinder1 = new CYLINDER (pModel, 280, 85, 115); pCylinder1->SetPosition(0, 0, -150-CoG); pCylinder1->SetOrientation(0, 0, 0); PCYLINDER pCylinder2 = new CYLINDER (pModel, 305, 90, 165); pCylinder2->SetPosition(0, 0, -450-CoG); pCylinder2->SetOrientation(0, 0, 0); PCYLINDER pCylinder3 = new CYLINDER (pModel, 410, 50, 90); pCylinder3->SetPosition(0, 0, -775-CoG); pCylinder3->SetOrientation(0, 0, 0); new NEWCTRL (pMainPlane, &Model.Aileron, 17.5, Degs2Rads(10), Degs2Rads(10) ); new NEWCTRL (pTailPlane1, &Model.Elevator, 30, Degs2Rads(20), Degs2Rads(30) ); new NEWCTRL (pTailPlane2, &Model.Elevator, 30, Degs2Rads(20), Degs2Rads(30) ); new NEWCTRL (pFin, &Model.Rudder, 40, Degs2Rads(30), Degs2Rads(30) ); new AERODEVICE (ControlledAC,pModel, AeroDevice::DT_FLAPS, 0.75, 0.15, -0.25, DEGS2RADS(5), 256, FLAPSUPDOWN, &adptr->acflaps);//RJS 14May98 new AERODEVICE (ControlledAC,pModel, AeroDevice::DT_GEAR, 0, 0.05, -0.01, 0, 4096/*128*/, GEARUPDOWN, NULL, 0); PENGINE pEngine = new ENGINE (pModel, ET_PISTON); pEngine->RotateDirection = 1; //Clockwise from behind pEngine->IdleSpeed = RPM2RADSPERCSEC (500); pEngine->MoI = 64e6; pEngine->PropInertia.x = 10000000; pEngine->PropInertia.y = 10000000; pEngine->PropInertia.z = 20000000; pEngine->BladeRadius = 170; pEngine->BladeArea = 17000; // 4x AR=5 //7771; pEngine->GearRatio = 0.479; pEngine->pPower100 = _CurveRsc.FindCurve ("YAK9", "Power100"); pEngine->pPower0 = _CurveRsc.FindCurve ("F51D", "Power0"); pEngine->pPowerAlt = _CurveRsc.FindCurve ("F51D", "PowerAlt"); pEngine->pPowerAltSuper = _CurveRsc.FindCurve ("F51D", "PowerAltSuper"); //CSB //DeadCode CSB 28/04/99 pEngine->pPropEff = _CurveRsc.FindCurve ("F51D", "PropEff"); //DeadCode CSB 28/04/99 pEngine->pPropTq = _CurveRsc.FindCurve ("F51D", "PropTq"); //DeadCode AMM 29Jun99 pEngine->EngineCount = 1; pEngine->HighBlowerAlt = 457205; //High Gear Supercharger cuts in at 15000ft //CSB pEngine->LowBlowerAlt = 411485; //High Gear Supercharger cuts out at 13500ft //CSB pEngine->BlowerHigh = FALSE; pEngine->p0 = 1590; pEngine->T100 = 1185000; pThrust->SetEngine (pEngine); pEngine->SetThrustPoint (pThrust); Coords3D w,c1,c2; FCRD CG; //Relative to the centre of the shape CG.x = Model.ShapeCoG.x; CG.y = Model.ShapeCoG.y; CG.z = Model.ShapeCoG.z; SHAPE.GetContactPoint(ControlledAC, CT_EYE, w, c1, c2); Model.PilotEyePos.x = c1.X - CG.x; Model.PilotEyePos.y = c1.Y - CG.y; Model.PilotEyePos.z = c1.Z - CG.z; SHAPE.GetContactPoint(ControlledAC, CT_WHLBACK, w, c1, c2); PGEAR pTail = new GEAR (pModel, TAIL); pTail->SetDimensions (c1.X - CG.x, c1.Y - CG.y, c1.Z - CG.z, c2.X - CG.x, c2.Y - CG.y, c2.Z - CG.z); pTail->SetSuspension (10000, 250000); pTail->SetTyres (0.02, 0.75, 0); SHAPE.GetContactPoint(ControlledAC, CT_WHLLEFT, w, c1, c2); PGEAR pMainPort = new GEAR (pModel, PORT); pMainPort->SetDimensions (c1.X - CG.x, c1.Y - CG.y, c1.Z - CG.z, c2.X - CG.x, c2.Y - CG.y, c2.Z - CG.z); pMainPort->SetSuspension (40000, 1000000); pMainPort->SetTyres (0.02, 0.75, 10000); SHAPE.GetContactPoint(ControlledAC, CT_WHLRIGHT, w, c1, c2); PGEAR pMainStbd = new GEAR (pModel, STBD); pMainStbd->SetDimensions (c1.X - CG.x, c1.Y - CG.y, c1.Z - CG.z, c2.X - CG.x, c2.Y - CG.y, c2.Z - CG.z); pMainStbd->SetSuspension (40000, 1000000); pMainStbd->SetTyres (0.02, 0.75, 10000); Model.ControlForce = 100; // Relative amount of force feedback Model.BuffetForce = 100; pModel->SetMassInertias (ControlledAC, 0.75*26500, 0.75*36800, 0.75*11000); //0.75 * F80 //DeadCode CSB 22/03/99 pModel->SetMassInertias (ControlledAC, 18460, 30000, 8100); //Don't know //DeadCode CSB 22/03/99 pModel->SetMassInertias (ControlledAC, 26500, 36800, 11000); //F86E Model.MaxG = 9; Model.MinG = -5; new MODELANIM (ControlledAC,MA_SURFACE, pModel, &ControlledAC->fly.aileron, &adptr->acaileronr); new MODELANIM (ControlledAC,MA_SURFACE, pModel, &ControlledAC->fly.aileron, &adptr->acaileronl,32767,-32768);//RJS 14May98 new MODELANIM (ControlledAC,MA_SURFACE, pModel, &ControlledAC->fly.elevator, &adptr->acelevator,32767,-32768);//RJS 14May98 new MODELANIM (ControlledAC,MA_SURFACE, pModel, &ControlledAC->fly.rudder, &adptr->acrudder); new MODELANIM (ControlledAC,MA_GENERICFP, pModel, &ControlledAC->fly.rpm, &adptr->acrpm, 0, 65536); // new MODELANIM (ControlledAC,MA_GENERICFP, pModel, &pModel->Inst.Rpm1, &adptr->acrpm, 0, 65536); new MODELANIM (ControlledAC,MA_SUSPENSION, pTail, &adptr->aclegsuspb, 0, 255); new MODELANIM (ControlledAC,MA_SUSPENSION, pMainPort, &adptr->aclegsuspl, 0, 255); new MODELANIM (ControlledAC,MA_SUSPENSION, pMainStbd, &adptr->aclegsuspr, 0, 255); //DeadCode AMM 29Jun99 Model.CoordRudder = 768; Model.PowerBoost = 1.4; //DeadCode AMM 29Jun99 Model.ContrailBand = FEET2CM(10000); Model.ContrailDuration = 1.0; F51D_SetupAI (ControlledAC, Version); }