⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wheel.cs

📁 Introduction to 3d game engine design一书的源代码!
💻 CS
字号:
// created on 10/22/2002 at 12:02 PM
using System;

namespace VehicleDynamics
{
	public enum WhichWheel { LeftFront=0, RightFront, LeftRear, RightRear };

	public struct Wheel  
	{
		#region Attributes

		public	Vector	    offset;
		public  Vector      earth_location;		
		private double		rel_heading;
		public	double		radius;
		public	double		ground_height;
		public	double		altitude;
		public	double		height_above_ground;
		private	double		weight_over_wheel;
		private	double		static_weight_over_wheel;
		public	double		suspension_offset;
		public	double		max_suspension_offset;
		private	double		upwards_force;
		public	double		friction;
		private	double		stiction;
		private	double		sliding_friction;
		public	bool		bottomed_out;
		public	bool		touching_ground;
		public	bool		squealing;
		public	bool		sliding;
		public	bool		drive_wheel;
		public WhichWheel   position;

		private static double spring_constant = 61000.0;
		private static double damping = -700.0;
		#endregion

		#region Properties

		public double RelHeading { set { rel_heading = value; } }
		public double UpwardsForce { get { return upwards_force; } }
		public double WeightOverWheel { set { weight_over_wheel = value; } get { return weight_over_wheel; } }
		public double StaticWeightOverWheel { set { static_weight_over_wheel = value; } }
		public double Stiction 
		{ 
			set 
			{ 
				stiction = value; 
				sliding_friction = 0.6f * stiction;
			}
		}
		#endregion
	
		public Wheel(WhichWheel where)
		{
			position = where;
			offset = new Vector(0.0, 0.0, 0.0);
			earth_location = new Vector(0.0, 0.0, 0.0);
			rel_heading = 0.0;
			radius = 0.5;
			height_above_ground = 0.0;
			ground_height = 0.0;
			friction = 1.0;
			weight_over_wheel = 0.0;
			static_weight_over_wheel = 0.0;
			suspension_offset = 0.0;
			max_suspension_offset = 0.25;
			altitude = 0.0;
			bottomed_out = false;
			drive_wheel = false;
			sliding = false;
			sliding_friction = 0.0;
			squealing = false;
			stiction = 1.0;
			upwards_force = 0.0;
			touching_ground = true;
		}

		public void Process(float delta_t, Euler attitude, Vector acceleration, Vector velocity, Vector position)
		{
			double	temp;
			double	susp_delta;
			double	squeel_force;
			double	slide_force;
			double	grab_force;
			double	tire_side_force;

			earth_location.X = offset.X;
			earth_location.Y = offset.Y;
			earth_location.Z = offset.Z + suspension_offset;
			attitude.RotateAtoE( earth_location );

			altitude = position.Z + earth_location.Z - radius;

			height_above_ground = altitude - ground_height;

			touching_ground = height_above_ground <= 0.0f;

			if ( touching_ground ) 
			{
				suspension_offset = -height_above_ground;
			} 
			else 
			{
				suspension_offset = -max_suspension_offset;
			}

			susp_delta = (suspension_offset + height_above_ground) * delta_t;
			if ( Math.Abs(upwards_force - weight_over_wheel) < 2.0 ) 
			{
				suspension_offset -= susp_delta;
			}
			if ( suspension_offset > max_suspension_offset ) 
			{
				suspension_offset = max_suspension_offset;
			} 
			else if ( suspension_offset < -max_suspension_offset ) 
			{
				suspension_offset = -max_suspension_offset;
			}
			bottomed_out = suspension_offset == max_suspension_offset;

			temp = ( 0.3f * ( suspension_offset * suspension_offset ) / (max_suspension_offset * max_suspension_offset ) );
			if ( suspension_offset < 0.0f ) 
			{
				temp *= -1.0f;
			}
			if ( Math.Abs(suspension_offset) < 0.3f ) 
			{
				temp = 0.0f;  // suspension neutral
			}
			temp += 1.0f;
			if ( !touching_ground ) 
			{
				temp = 0.0f;
			}

			double spring_force = spring_constant * suspension_offset;
			double damping_force = damping * suspension_offset / max_suspension_offset;

			if ( touching_ground ) 
			{
				upwards_force = (spring_force + damping_force);
			} 
			else 
			{
				upwards_force = 0.0;
			}
//			upwards_force = static_weight_over_wheel * temp;  

			if ( (upwards_force - weight_over_wheel) > 2.0f ) 
			{
				suspension_offset -= 0.5f * delta_t;
			} 
			else if ( (upwards_force - weight_over_wheel) < -2.0f ) 
			{
				suspension_offset += 0.5f * delta_t;
			}

			slide_force = 32.0f * stiction * friction;
			squeel_force = 0.9f * slide_force;
			grab_force = 32.0f * sliding_friction;

			if ( (acceleration.Y > 0.0f && rel_heading > 0.0f ) || (acceleration.Y < 0.0f && rel_heading < 0.0f ) ) 
			{
				tire_side_force = (float)Math.Abs(acceleration.Y * (1.0f - Math.Cos(rel_heading)));
			} 
			else 
			{
				tire_side_force = (float)Math.Abs(acceleration.Y * Math.Cos(rel_heading));
			}

			squealing = false;
			sliding = false;
			if ( drive_wheel && acceleration.X >= slide_force ) 
			{  
				sliding = true;
			}
			if ( (acceleration.X < -squeel_force && acceleration.X > -slide_force) || 
				(tire_side_force > squeel_force && tire_side_force < slide_force) ) 
			{
				squealing = true;
			}
			if ( acceleration.X <= -slide_force || tire_side_force >= slide_force ) 
			{
				sliding = true;
			}
			if ( Math.Abs(acceleration.X) < grab_force && Math.Abs(velocity.Y)< grab_force && tire_side_force < grab_force ) 
			{
				sliding = false;
			}
		}

	};
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -