亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? car.cs

?? Introduction to 3d game engine design一書的源代碼!
?? CS
?? 第 1 頁 / 共 2 頁
字號:
using System;
using System.Threading;
using System.Diagnostics;

namespace VehicleDynamics
{
	public class CarDynamics : IDisposable
	{
		public enum IgnitionState { IgnitionOff, IgnitionOn, IgnitionStart };
		public enum GearState { Park=0, Reverse=1, Neutral=2, Drive=3, FirstGear=4, SecondGear=5, ThirdGear=6 };

	#region Attributes
		private	Euler			attitude = new Euler();
		private	Euler			attitude_rate = new Euler();
		private	Euler			ground_slope = new Euler();
		private	Vector			position = new Vector();
		private	Vector			velocity = new Vector();			// body velocity
		private	Vector			earth_velocity = new Vector();		// earth velocity
		private	Vector			acceleration = new Vector();		// body accelerations
		private	Vector			body_gravity = new Vector();
		private	Wheel[]			wheel = new Wheel[4];
		private	double			weight;
		private	double			cg_height;
		private	double			wheel_base;
		private	double			wheel_track;
		private	double			wheel_angle;
		private	double			wheel_max_angle; 
		private	double			weight_distribution;
		private	double			front_weight;
		private	double			back_weight;
		private	double			wheel_pos;
		private	double			throttle;
		private	double			brake;
		private	double			engine_rpm;
		private	double			wheel_rpm;
		private	double			wheel_force;
		private	double			net_force;
		private	double			drag;
		private	double			rolling_resistance;
		private	double			eng_torque;
		private	double			mph;
		private	double			brake_torque;
		private	double			engine_loss;
		private	double			idle_rpm;
		private	double			max_rpm;
		private	double			target_rpm;
		private	double			engine_horsepower;
		private	double			max_engine_torque;
		private	double			air_density;
		private	double			drag_coeff;
		private	double			frontal_area;
		private	double			wheel_diameter;
		private	double			mass;		// in slugs
		private	double			inverse_mass;		// in slugs
		private	float			centripedal_accel;
		private	bool			running;
		private	bool			front_wheel_drive = false;
		private	GearState		gear;
		private	GearState		auto_gear = GearState.Drive;
		private	double[]		gear_ratio = new double[7];
		private	LFI				torque_curve = new LFI();      // percent max torque - index by % max RPM * 10
		private	IgnitionState	ignition_state = IgnitionState.IgnitionOn;
		private bool            was_sliding = false;
		private Thread          m_process_thread;
		private bool            thread_active = true;
		private Mutex           mutex = new Mutex();

	#endregion

	#region Properties
		public double SteeringWheel	{ get { return wheel_pos; } set { wheel_pos = value; } }

		public bool EngineRunning { get { return running; } }

		public double EngineRPM { get { return engine_rpm; } }

		public double Throttle { get { return throttle; } set { throttle = value; } }

		public double Brake { get { return brake; } set { brake = value; } }

		public GearState Gear { get { return gear; } set { gear = value; } }

		public IgnitionState Ignition { get { return ignition_state; }
			set 
			{
				ignition_state = value;
				if ( ignition_state == IgnitionState.IgnitionStart && 
					( gear == GearState.Park || gear == GearState.Neutral ) ) 
				{
					running = true;
				} 
				else if ( ignition_state == IgnitionState.IgnitionOff ) 
				{
					running = false;
				}
			}
		}

		public double Roll { get { return attitude.Phi; } set { attitude.Phi = value; } }
		public double Pitch { get { return attitude.Theta; } set { attitude.Theta = value; } }
		public double Heading { get { return attitude.Psi; } set { attitude.Psi = value; } }

		public double North { get { return position.X; } set { position.X = value; } }
		public double East { get { return position.Y; } set { position.Y = value; } }
		public double Height { get { return position.Z; } set { position.Z = value; } }

		public double NorthVelocity { get { return velocity.X; } set { velocity.X = value; } }
		public double EastVelocity { get { return velocity.Y; } set { velocity.Y = value; } }
		public double VerticalVelocity { get { return velocity.Z; } set { velocity.Z = value; } }

		public double ForwardVelocity { get { return velocity.X; } }
		public double SidewaysVelocity { get { return velocity.Y; } }
		public double WheelRadius { get { return wheel[(int)WhichWheel.LeftFront].radius; }
			set 
			{
				wheel_diameter = value * 2.0;
				wheel[(int)WhichWheel.LeftFront].radius = value;
				wheel[(int)WhichWheel.LeftRear].radius = value; 
				wheel[(int)WhichWheel.RightFront].radius = value; 
				wheel[(int)WhichWheel.RightRear].radius = value; } 
		}

		public double HorsePower { get { return engine_horsepower; } set { engine_horsepower = value; } }

		public double LFGroundHeight { set { wheel[(int)WhichWheel.LeftFront].ground_height = value; } }
		public double RFGroundHeight { set { wheel[(int)WhichWheel.RightFront].ground_height = value; } }
		public double LRGroundHeight { set { wheel[(int)WhichWheel.LeftRear].ground_height = value; } }
		public double RRGroundHeight { set { wheel[(int)WhichWheel.RightRear].ground_height = value; } }

		public double MPH { get { return mph; } }
		public bool   Running { get { return running; } }

	#endregion

		public CarDynamics()
		{
			engine_horsepower = 470.0f;
			torque_curve.SetDataPoint(  0, 0.0f );
			torque_curve.SetDataPoint(  10, 0.00f );
			torque_curve.SetDataPoint(  20, 0.22f );
			torque_curve.SetDataPoint(  30, 0.5f );
			torque_curve.SetDataPoint(  40, 0.72f );
			torque_curve.SetDataPoint(  50, 0.9f );
			torque_curve.SetDataPoint(  60, 1.0f );
			torque_curve.SetDataPoint(  70, 0.98f );
			torque_curve.SetDataPoint(  80, 0.89f );
			torque_curve.SetDataPoint(  90, 0.5f );
			torque_curve.SetDataPoint( 100, 0.13f );
			wheel[(int)WhichWheel.LeftFront]  = new Wheel(WhichWheel.LeftFront);
			wheel[(int)WhichWheel.RightFront] = new Wheel(WhichWheel.RightFront);
			wheel[(int)WhichWheel.LeftRear]   = new Wheel(WhichWheel.LeftRear);
			wheel[(int)WhichWheel.RightRear]  = new Wheel(WhichWheel.RightRear);
			Reset();
			m_process_thread = new Thread(new ThreadStart(Process));
			m_process_thread.Start();
		}

		public void Process()
		{
			float delta_t = 0.01f;
               
			Debug.WriteLine("car physics thread started");
			while ( thread_active )
			{
				Process( delta_t );
				Thread.Sleep(10);
			}
			Debug.WriteLine("car physics thread terminated");
		}

		public void Reset()
		{
			wheel_max_angle = 0.69813170079773183076947630739545; // 40 degrees
			idle_rpm = 700.0f;
			max_rpm = 7000.0f;
			engine_rpm = 0.0f;
			attitude.Theta = 0.0f;
			attitude.Phi = 0.0f;
			attitude.Psi = 0.0f;
			attitude_rate.Theta = 0.0;
			attitude_rate.Phi = 0.0;
			attitude_rate.Psi = 0.0;
			position.X = 0.0;
			position.Y = 0.0;
			position.Z = 0.0;
			velocity.X = 0.0;			// body velocity
			velocity.Y = 0.0;			// body velocity
			velocity.Z = 0.0;			// body velocity
			acceleration.X = 0.0;		// body accelerations
			acceleration.Y = 0.0;		// body accelerations
			acceleration.Z = 0.0;		// body accelerations
			cg_height             = -1.0;
			wheel_base            = 5.0;
			wheel_track           = 8.0;
			weight                = 2000.0;
			WheelRadius = 0.25;
			wheel[(int)WhichWheel.LeftFront ].offset.Set( wheel_track / 2.0f, -wheel_base / 2.0f, +cg_height + wheel[(int)WhichWheel.LeftFront].radius );
			wheel[(int)WhichWheel.RightFront].offset.Set( wheel_track / 2.0f,  wheel_base / 2.0f, +cg_height + wheel[(int)WhichWheel.LeftFront].radius );
			wheel[(int)WhichWheel.LeftRear  ].offset.Set(-wheel_track / 2.0f, -wheel_base / 2.0f, +cg_height + wheel[(int)WhichWheel.LeftFront].radius );
			wheel[(int)WhichWheel.RightRear ].offset.Set(-wheel_track / 2.0f,  wheel_base / 2.0f, +cg_height + wheel[(int)WhichWheel.LeftFront].radius );
			for ( int i=0; i<4; i++ ) 
			{
				wheel[i].StaticWeightOverWheel = weight / 4.0;
			}
			weight_distribution   = 0.5f;
			front_weight          = weight * ( 1.0 - weight_distribution);
			back_weight           = weight * weight_distribution;
			wheel_pos             = 0.0f;
			throttle              = 0.0f;
			brake                 = 0.0f;
			engine_rpm            = 0.0f;
			wheel_rpm             = 0.0f;
			wheel_force           = 0.0f;
			net_force             = 0.0f;
			mph                   = 0.0f;
			drag                  = 0.0f;
			rolling_resistance    = 0.0f;
			eng_torque            = 0.0f;
			brake_torque          = 0.0f;
			engine_loss           = 0.0f;
			air_density           = 0.068;
			drag_coeff            = 0.004f;
			frontal_area          = 20.0f;
			mass                  = weight * 0.031080950172;		// in slugs
			inverse_mass          = 1.0 / mass;
			running = true;
			front_wheel_drive = false;
			gear = GearState.Drive;
			gear_ratio[(int)GearState.Park]			= 0.0f;		
			gear_ratio[(int)GearState.Reverse]		= -80.0f;
			gear_ratio[(int)GearState.Neutral]		= 0.0f;
			gear_ratio[(int)GearState.Drive]		= 45.0f;
			gear_ratio[(int)GearState.FirstGear]	= 70.0f;
			gear_ratio[(int)GearState.SecondGear]	= 50.0f;
			gear_ratio[(int)GearState.ThirdGear]	= 30.0f;
			ignition_state = IgnitionState.IgnitionOn;
			max_engine_torque = engine_horsepower * 255.00f;

			if ( front_wheel_drive ) 
			{
				wheel[(int)WhichWheel.LeftFront ].drive_wheel = true;
				wheel[(int)WhichWheel.RightFront].drive_wheel = true;
				wheel[(int)WhichWheel.LeftRear  ].drive_wheel = false;
				wheel[(int)WhichWheel.RightRear ].drive_wheel = false;
			} 
			else 
			{
				wheel[(int)WhichWheel.LeftFront ].drive_wheel = false;
				wheel[(int)WhichWheel.RightFront].drive_wheel = false;
				wheel[(int)WhichWheel.LeftRear  ].drive_wheel = true;
				wheel[(int)WhichWheel.RightRear ].drive_wheel = true;
			}
		}

		private void IntegratePosition( float delta_t )
		{
   
			Vector	earth_velocity;            

			velocity.IncrementX( delta_t * acceleration.X );
			velocity.IncrementY( delta_t * acceleration.Y );
			velocity.IncrementZ( delta_t * acceleration.Z );

			if ( velocity.X > 48.0 ) 
			{
				velocity.X = 48.0;
				acceleration.X = -1.0;
			}
			if ( velocity.X < 0.0 ) 
			{
				velocity.X = 0.0;
				acceleration.X = 0.5;
			}

			attitude = attitude + (attitude_rate * delta_t);
			attitude.Limits();

			earth_velocity = new Vector( velocity );
			attitude.RotateAtoE( earth_velocity );

			position.IncrementX( delta_t * earth_velocity.X );
			position.IncrementY( delta_t * earth_velocity.Y );
			position.IncrementZ( delta_t * earth_velocity.Z );
//			Debug.WriteLine("accelZ = " + acceleration.Z + " velz = " + velocity.Z + " posz = " + position.Z);

			mph = (float)velocity.X * 3600.0f / 5280.0f;
			
		}

		private void CalcWeightTransfer()
		{
			front_weight = (1.0f - weight_distribution) * weight + (float)acceleration.X * cg_height / wheel_base;
			back_weight = weight - front_weight;

			wheel[(int)WhichWheel.LeftFront].WeightOverWheel  = 0.5f * front_weight - (float)acceleration.Y * cg_height / wheel_track;
			wheel[(int)WhichWheel.RightFront].WeightOverWheel = front_weight - wheel[(int)WhichWheel.LeftFront].WeightOverWheel;
			wheel[(int)WhichWheel.LeftRear].WeightOverWheel   = 0.5f * back_weight - (float)acceleration.Y * cg_height / wheel_track;
			wheel[(int)WhichWheel.RightRear].WeightOverWheel  = back_weight - wheel[(int)WhichWheel.LeftRear].WeightOverWheel;
		}

		public void SetFriction(WhichWheel the_wheel, float friction)
		{
			wheel[(int)the_wheel].friction = friction;
		}

		public void SetGearRatio(GearState state, float ratio)
		{
			gear_ratio[(int)state] = ratio;
		}

		public float WheelNorth(WhichWheel the_wheel)
		{
			return (float)wheel[(int)the_wheel].earth_location.X;
		}

		public float WheelEast(WhichWheel the_wheel)
		{
			return (float)wheel[(int)the_wheel].earth_location.Y;
		}

		public float WheelHeight(WhichWheel the_wheel)
		{
			return (float)wheel[(int)the_wheel].earth_location.Z;
		}

		public void SetWheelAltitude(WhichWheel the_wheel, float altitude)
		{
			wheel[(int)the_wheel].ground_height = altitude;
		}

		public void SetWheelOffset(WhichWheel the_wheel, float forward, float right, float up)
		{
			wheel[(int)the_wheel].offset.X = forward;
			wheel[(int)the_wheel].offset.Y = right;
			wheel[(int)the_wheel].offset.Z = up;
		}

		public void Dispose()
		{
			Debug.WriteLine("car physics Dispose");
			thread_active = false;
			Thread.Sleep(20);
		}

		void Process(float delta_t)
		{
			double temp;  
			double delta_rpm;
			double current_gear_ratio = 0.0;
			double brake_force;
			double percent_rpm;
			double turn_rate;
			bool  shift_up;
			bool  shift_down;
			double delta_psi;
			Vector	gravity = new Vector(0.0f, 0.0f, 32.0f);        

			wheel_angle = wheel_pos * wheel_max_angle;

			wheel[(int)WhichWheel.LeftFront].RelHeading = wheel_angle;
			wheel[(int)WhichWheel.RightFront].RelHeading = wheel_angle;

			double sine_wheel = Math.Sin(wheel_angle);

			turn_rate = (sine_wheel * velocity.X / wheel_track) / 10.0f;
//			Debug.WriteLine( "sine_wheel=" + sine_wheel + " turn rate=" + turn_rate);

			if ( wheel[(int)WhichWheel.LeftFront].sliding && wheel[(int)WhichWheel.RightFront].sliding ) 
			{
//				turn_rate = 0.0f;
			}

			attitude_rate.Psi = turn_rate;

			delta_psi = turn_rate * delta_t;

			centripedal_accel = (float)(2.0 * velocity.X * Math.Sin(delta_psi) ) / delta_t;

			wheel_rpm = 60.0f * velocity.X / (Math.PI * wheel_diameter);

			rolling_resistance = 0.00696f * (float)Math.Abs(velocity.X);

			drag = 0.5f * drag_coeff * frontal_area * air_density * Math.Abs(velocity.X * velocity.X);

			brake_force = brake * 32.0;  // max braking 1G

			if ( mph < 0.0 ) // braking force opposes movement
			{
				brake_force *= -1.0;
			}

			if ( wheel[(int)WhichWheel.LeftFront].sliding && wheel[(int)WhichWheel.RightFront].sliding && 
				wheel[(int)WhichWheel.RightRear].sliding && wheel[(int)WhichWheel.RightRear].sliding ) 
			{
				brake_force = 0.0f;
			}

			percent_rpm = engine_rpm / max_rpm;

			switch ( gear ) 
			{
				case GearState.Park:
					if ( mph > 1.0  || mph < -1.0 ) 
					{
						brake_force = 32.0;
					} 
					else 
					{
						velocity.SetX(0.0f);
					}
					auto_gear = GearState.Park;
					break;
				case GearState.Reverse:
					auto_gear = GearState.Reverse;
					break;
				case GearState.Neutral:
					auto_gear = GearState.Neutral;
					break;
				case GearState.Drive:
					shift_up = false;
					shift_down = false;
					if ( ( percent_rpm > 0.8 && auto_gear < GearState.Drive ) ||
						( percent_rpm > 0.1 && auto_gear == GearState.Neutral ) ) 
					{
						shift_up = true;
					}
					if ( percent_rpm < 0.4 && auto_gear >= GearState.FirstGear ) 
					{
						shift_down = true;
					}
				switch ( auto_gear ) 
				{
					case GearState.Neutral:
						if ( shift_up ) 
						{
							auto_gear = GearState.FirstGear;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91亚洲精品久久久蜜桃| 成人午夜私人影院| 亚洲国产综合色| 亚洲乱码国产乱码精品精可以看| 欧美—级在线免费片| 欧美国产精品一区二区三区| 国产亚洲1区2区3区| 国产精品视频一二| 亚洲天堂福利av| 一区二区在线看| 亚洲高清视频中文字幕| 五月天亚洲精品| 奇米综合一区二区三区精品视频| 奇米一区二区三区av| 激情丁香综合五月| 99在线精品观看| 欧美年轻男男videosbes| 国产综合一区二区| 午夜日韩在线观看| 久久国产人妖系列| 成人一区二区三区视频| 在线观看区一区二| 日韩视频123| 中文字幕欧美区| 亚洲电影欧美电影有声小说| 美腿丝袜亚洲色图| 91丨九色丨蝌蚪富婆spa| 在线综合+亚洲+欧美中文字幕| 日韩精品专区在线影院观看| 国产精品久久久久天堂| 午夜视频久久久久久| 国产成人在线视频免费播放| 欧美日韩黄色一区二区| 日本一区二区三区电影| 香蕉久久夜色精品国产使用方法 | 99精品桃花视频在线观看| 91啪九色porn原创视频在线观看| 欧美一区二区三区啪啪| 亚洲欧美在线另类| 捆绑变态av一区二区三区| 91色|porny| 26uuu精品一区二区| 亚洲永久免费av| 国产成人av福利| 欧美成人一区二区三区片免费| 亚洲免费av观看| 国产成人自拍高清视频在线免费播放| 在线亚洲一区二区| 中文字幕一区二区在线播放| 九九在线精品视频| 欧美精品一二三| 夜夜嗨av一区二区三区中文字幕| 国产麻豆精品视频| 91精品国产品国语在线不卡| 亚洲一区二区三区中文字幕在线| 成人性色生活片| 日韩免费在线观看| 日韩高清一区在线| 欧美日韩三级视频| 亚洲老司机在线| 99久久精品国产精品久久| 国产免费观看久久| 精品在线观看免费| 欧美大片一区二区三区| 丝袜国产日韩另类美女| 欧美日韩亚洲综合在线 | 另类欧美日韩国产在线| 欧美日韩精品系列| 亚洲综合清纯丝袜自拍| 色欲综合视频天天天| 国产精品国产自产拍高清av| 国产精品中文有码| 久久综合久久综合九色| 狠狠色狠狠色综合日日91app| 日韩亚洲欧美一区二区三区| 免费人成精品欧美精品| 日韩午夜中文字幕| 裸体健美xxxx欧美裸体表演| 日韩免费看的电影| 国产精品一区二区无线| 国产亚洲一区二区三区四区 | 色综合久久天天| 亚洲美女屁股眼交| 欧美在线观看视频一区二区三区| 一片黄亚洲嫩模| 欧美日韩成人激情| 看片网站欧美日韩| 国产欧美日韩在线| 99r国产精品| 亚洲一区在线电影| 欧美三级乱人伦电影| 日本大胆欧美人术艺术动态| 欧美成人福利视频| 国产成人在线视频网站| 一区二区三区 在线观看视频| 欧美日韩在线亚洲一区蜜芽| 久久99国产精品麻豆| 国产色一区二区| 91在线播放网址| 麻豆精品国产传媒mv男同| 久久久99精品久久| 91福利在线导航| 国内精品国产成人| 亚洲女子a中天字幕| 91精品国产欧美日韩| 国产成人午夜精品影院观看视频| 一区二区理论电影在线观看| 日韩午夜精品电影| 成人av网站在线| 奇米影视在线99精品| 亚洲欧美日本在线| 欧美白人最猛性xxxxx69交| 99re8在线精品视频免费播放| 婷婷综合久久一区二区三区| 中文av一区特黄| 欧美日韩国产综合久久| 国产91在线观看丝袜| 天堂一区二区在线| ...av二区三区久久精品| 日韩欧美一区二区免费| 在线亚洲欧美专区二区| 国内精品久久久久影院薰衣草 | 亚洲一区二区三区美女| 久久色在线视频| 欧美日韩激情在线| 91福利在线观看| 不卡的电影网站| 国内精品久久久久影院一蜜桃| 亚洲第一福利视频在线| 亚洲女与黑人做爰| 国产精品乱子久久久久| 日韩精品一区二区三区在线观看| 在线观看一区日韩| 91亚洲午夜精品久久久久久| 国产成人欧美日韩在线电影| 久久99久久99小草精品免视看| 亚洲18色成人| 亚洲精品国产a久久久久久| 国产精品视频yy9299一区| 欧美刺激脚交jootjob| 日韩亚洲欧美一区| 欧美卡1卡2卡| 欧美精品18+| 欧美日韩成人综合在线一区二区| 在线精品亚洲一区二区不卡| 一本一本久久a久久精品综合麻豆| 成人av午夜电影| av电影在线观看不卡| jizz一区二区| 97久久超碰精品国产| av在线免费不卡| 色综合视频在线观看| 色av成人天堂桃色av| 在线视频一区二区三区| 欧美在线免费播放| 欧美福利一区二区| 日韩欧美三级在线| 精品国精品国产尤物美女| 精品美女被调教视频大全网站| 日韩一区二区精品| 久久精品一区二区三区不卡| 国产清纯在线一区二区www| 国产视频一区在线播放| 亚洲欧洲精品一区二区三区不卡| 国产精品国产三级国产普通话99| 国产精品电影一区二区三区| 亚洲欧洲99久久| 亚洲电影激情视频网站| 喷水一区二区三区| 国产精品一二三四五| 99视频超级精品| 欧美男女性生活在线直播观看| 91精品国产综合久久久久久久久久 | 国产日本欧美一区二区| 亚洲少妇中出一区| 亚洲va欧美va天堂v国产综合| 另类小说综合欧美亚洲| 成人免费视频一区| 欧美在线观看视频一区二区三区| 91麻豆精品久久久久蜜臀| 久久久三级国产网站| 国产精品电影一区二区三区| 图片区小说区区亚洲影院| 久久99久久99| 色综合亚洲欧洲| 欧美大黄免费观看| 亚洲私人黄色宅男| 日本色综合中文字幕| 丁香桃色午夜亚洲一区二区三区| 色婷婷综合久色| 精品久久人人做人人爰| 亚洲天堂网中文字| 国产在线精品不卡| 欧美日韩高清一区二区不卡| 久久久久久久综合狠狠综合| 亚洲制服丝袜av| 国产成人免费在线观看| 91精品国产综合久久精品性色| 国产精品美女久久久久高潮| 蜜臀av性久久久久蜜臀av麻豆|