Example #1
0
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);
}
Example #2
0
//컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴
//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);

}
Example #3
0
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);
}