Jump to content
Sign in to follow this  
Richards.D

Vehicle suspension issues, not touching ground

Recommended Posts

Hello everyone:

I'm working on a vehicle and it currently has what seems like a common issue, but I did a great deal of searching on these forums and could not come across the solution. My vehicle floats, and the suspension is very slumped to the rear. When I board and accelerate, the suspension gets very stiff and drives much too high. Also, the wheels "float" off the ground a few centimeters, not a ton, but a little. I tweaked memory LOD continuously thinking that was the issue, but after a few hours of that I believe the problem lies elsewhere. I have a proper Phys-X LOD with 2 components and I've checked the other LODs such as Geometry for a while but to avail. The model has no errors that pop up when I load it, so I am really out of options at the moment. This vehicle's config files come from the demo vehicle, so I am very confused as to why it is having this issue. Thank you in advance!

Richards

CONFIG.CPP

#include "basicdefines_A3.hpp"
class DefaultEventhandlers;

class CfgPatches
{
class DAR_Impala_F
{
	units[]				= {"DAR_ImpalaINT"};
	weapons[]			= {};
	requiredVersion		= 0.1;
	requiredAddons[]	= {"A3_Soft_F"};
};
};

class WeaponFireGun;
class WeaponCloudsGun;
class WeaponFireMGun;
class WeaponCloudsMGun;

class CfgVehicles
{
class Car;
class Car_F: Car
{
	class HitPoints /// we want to use hitpoints predefined for all cars
	{
		class HitLFWheel;
		class HitLF2Wheel;

		class HitRFWheel;
		class HitRF2Wheel;
		class HitBody;

		class HitGlass1;
		class HitGlass2;
		class HitGlass3;
		class HitGlass4;
	};	
};

class DAR_ImpalaCiv: Car_F
{
	model 	= "\Impala\DAR_ImpalaINT.p3d";  
	picture	= "\A3\Weapons_F\Data\placeholder_co.paa"; 
	Icon	= "\A3\Weapons_F\Data\placeholder_co.paa"; 

	displayName = "Chevrolet Impala Civilian"; 

	terrainCoef 	= 6.5; 	/// different surface affects this car more, stick to tarmac
	turnCoef 		= 2.5; 	/// should match the wheel turn radius
	precision 		= 10; 	/// how much freedom has the AI for its internal waypoints - lower number means more precise but slower approach to way
	brakeDistance 	= 3.0; 	/// how many internal waypoints should the AI plan braking in advance
	acceleration 	= 15; 	/// how fast acceleration does the AI think the car has

	fireResistance 	= 5; 	/// lesser protection against fire than tanks
	armor 			= 32; 	/// just some protection against missiles, collisions and explosions
	cost			= 50000; /// how likely is the enemy going to target this vehicle

	transportMaxBackpacks 	= 10; /// just some backpacks fit the trunk by default
	transportSoldier 		= 3; /// number of cargo except driver

	/// some values from parent class to show how to set them up
	wheelDamageRadiusCoef 	= 0.9; 			/// for precision tweaking of damaged wheel size
	wheelDestroyRadiusCoef 	= 0.4;			/// for tweaking of rims size to fit ground
	maxFordingDepth 		= 0.5;			/// how high water would damage the engine of the car
	waterResistance 		= 1;			/// if the depth of water is bigger than maxFordingDepth it starts to damage the engine after this time
	crewCrashProtection		= 0.20;			/// multiplier of damage to crew of the vehicle => low number means better protection
	driverLeftHandAnimName 	= "drivewheel"; /// according to what bone in model of car does hand move
	driverRightHandAnimName = "drivewheel";	/// beware, non-existent bones may cause game crashes (even if the bones are hidden during play)

	class TransportItems /// some first aid kits in trunk according to safety regulations
	{
		item_xx(FirstAidKit,4);
	};			

	class Turrets{}; /// doesn't have any gunner nor commander
	class HitPoints : HitPoints
	{
		class HitLFWheel:HitLFWheel	{armor=0.125; passThrough=0;}; /// it is easier to destroy wheels than hull of the vehicle
		class HitLF2Wheel:HitLF2Wheel{armor=0.125; passThrough=0;};

		class HitRFWheel:HitRFWheel	{armor=0.125; passThrough=0;};
		class HitRF2Wheel:HitRF2Wheel{armor=0.125; passThrough=0;}; 

		class HitFuel 			{armor=0.50; material=-1; name="fueltank"; visual=""; passThrough=0.2;}; /// correct points for fuel tank, some of the damage is aFRLied to the whole
		class HitEngine 		{armor=0.50; material=-1; name="engine"; visual=""; passThrough=0.2;};
		class HitBody: HitBody 	{name = "body"; visual="camo1"; passThrough=1;}; /// all damage to the hull is aFRLied to total damage

		class HitGlass1:HitGlass1 {armor=0.25;}; /// it is pretty easy to puncture the glass but not so easy to remove it
		class HitGlass2:HitGlass2 {armor=0.25;};
		class HitGlass3:HitGlass3 {armor=0.25;};
		class HitGlass4:HitGlass4 {armor=0.25;};
	};

	driverAction 		= driver_offroad01; /// what action is going the driver take inside the vehicle. Non-existent action makes the vehicle inaccessible
	cargoAction[] 		= {passenger_low01, passenger_generic01_foldhands, passenger_generic01_foldhands}; /// the same of all the crew
	getInAction 		= GetInLow; 		/// how does driver look while getting in
	getOutAction 		= GetOutLow; 		/// and out
	cargoGetInAction[] 	= {"GetInLow"}; 	/// and the same for the rest, if the array has fewer members than the count of crew, the last one is used for the rest
	cargoGetOutAction[] = {"GetOutLow"}; 	/// that means all use the same in this case

	#include "sounds.hpp"	/// sounds are in a separate file to make this one simple
	#include "pip.hpp"		/// PiPs are in a separate file to make this one simple
	#include "physx.hpp"	/// PhysX settings are in a separate file to make this one simple

	/// memory points where do tracks of the wheel appear
	// front left track, left offset
	memoryPointTrackFLL = "TrackFLL"; 
	// front left track, right offset
	memoryPointTrackFLR = "TrackFLR"; 
	// back left track, left offset
	memoryPointTrackBLL = "TrackBLL"; 
	// back left track, right offset
	memoryPointTrackBLR = "TrackBLR"; 
	// front right track, left offset
	memoryPointTrackFRL = "TrackFRL"; 
	// front right track, right offset
	memoryPointTrackFRR = "TrackFRR"; 
	// back right track, left offset
	memoryPointTrackBRL = "TrackBRL"; 
	// back right track, right offset
	memoryPointTrackBRR = "TrackBRR"; 		

	class Damage /// damage changes material in specific places (visual in hitPoint)
	{
		tex[]={};
		mat[]=
		{
			"A3\data_f\glass_veh_int.rvmat", 		/// material mapped in model
			"A3\data_f\Glass_veh_damage.rvmat", 	/// changes to this one once damage of the part reaches 0.5
			"A3\data_f\Glass_veh_damage.rvmat",		/// changes to this one once damage of the part reaches 1

			"A3\data_f\glass_veh.rvmat",			/// another material
			"A3\data_f\Glass_veh_damage.rvmat",		/// changes into different ones
			"A3\data_f\Glass_veh_damage.rvmat",
		};
	};

	class Exhausts /// specific exhaust effects for the car
	{
		class Exhaust1 /// the car has two exhausts - each on one side
		{
			position 	= "exhaust";  		/// name of initial memory point
			direction 	= "exhaust_dir";	/// name of memory point for exhaust direction
			effect 		= "ExhaustsEffect";	/// what particle effect is it going to use
		};
		class Exhaust2
		{
			position 	= "exhaust2_pos";
			direction 	= "exhaust2_dir";
			effect 		= "ExhaustsEffect";
		};				
	};		
	class Reflectors	/// only front lights are considered to be reflectors to save CPU
	{
		class LightCarHeadL01 	/// lights on each side consist of two bulbs with different flares
		{
			color[] 		= {1900, 1800, 1700};		/// approximate colour of standard lights
			ambient[]		= {5, 5, 5};				/// nearly a white one
			position 		= "LightCarHeadL01";		/// memory point for start of the light and flare
			direction 		= "LightCarHeadL01_end";	/// memory point for the light direction
			hitpoint 		= "Light_L";				/// point(s) in hitpoint lod for the light (hitPoints are created by engine)
			selection 		= "Light_L";				/// selection for artificial glow around the bulb, not much used any more
			size 			= 1;						/// size of the light point seen from distance
			innerAngle 		= 100;						/// angle of full light
			outerAngle 		= 179;						/// angle of some light
			coneFadeCoef 	= 10;						/// attenuation of light between the above angles
			intensity 		= 1;						/// strength of the light
			useFlare 		= true;						/// does the light use flare?
			dayLight 		= false;					/// switching light off during day saves CPU a lot
			flareSize 		= 1.0;						/// how big is the flare
			class Attenuation
			{
				start 			= 1.0;
				constant 		= 0; 
				linear 			= 0; 
				quadratic 		= 0.25; 
				hardLimitStart 	= 30;		/// it is good to have some limit otherwise the light would shine to infinite distance
				hardLimitEnd 	= 60;		/// this allows adding more lights into scene
			};
		};		
		class LightCarHeadL02:LightCarHeadL01
		{
			position 	= "LightCarHeadL02";
			direction 	= "LightCarHeadL02_end";
			FlareSize 	= 0.5;						/// side bulbs aren't that strong
		};
		class LightCarHeadR01:LightCarHeadL01
		{
			position 	= "LightCarHeadR01";
			direction 	= "LightCarHeadR01_end";
			hitpoint 	= "Light_R";
			selection 	= "Light_R";
		};
		class LightCarHeadR02:LightCarHeadR01
		{
			position 	= "LightCarHeadR02";
			direction 	= "LightCarHeadR02_end";
			FlareSize 	= 0.5;
		};
	};
	aggregateReflectors[] = {{"LightCarHeadL01", "LightCarHeadL02"}, {"LightCarHeadR01", "LightCarHeadR02"}}; /// aggregating reflectors helps the engine a lot
	/// it might be even good to aggregate all lights into one source as it is done for most of the cars
};

class DAR_ImpalaCiv_F: DAR_ImpalaCiv /// some class that is going to be visible in editor
{	
	scope	= 2; 			/// makes the car visible in editor
	crew 	= "C_man_1"; 	/// we need someone to fit into the car
	side	= 3; 			/// civilian car should be on civilian side
	faction	= CIV_F;		/// and with civilian faction
};	
};




MODEL. CFG

class Rotation
{
type = "rotation";
memory = 1;
minValue = 0;
maxValue = 1;
angle0 = 0;
angle1 = 1;
};
class CfgSkeletons
{
class Default
{
	isDiscrete = 1;
	skeletonInherit = "";
	skeletonBones[] = {};
};
class Vehicle : Default {};
class Car : Vehicle {
	skeletonBones[]=
	{
		"drivewheel","",

		"wheel_1_1_damper_land","",
		"wheel_1_2_damper_land","",
		"wheel_1_3_damper_land","",
		"wheel_1_4_damper_land","",

		"wheel_2_1_damper_land","",
		"wheel_2_2_damper_land","",
		"wheel_2_3_damper_land","",
		"wheel_2_4_damper_land","",

		"wheel_1_1_damper","wheel_1_1_damper_land",
		"wheel_1_2_damper","wheel_1_2_damper_land",
		"wheel_1_3_damper","wheel_1_3_damper_land",
		"wheel_1_4_damper","wheel_1_4_damper_land",

		"wheel_2_1_damper","wheel_2_1_damper_land",
		"wheel_2_2_damper","wheel_2_2_damper_land",
		"wheel_2_3_damper","wheel_2_3_damper_land",
		"wheel_2_4_damper","wheel_2_4_damper_land",

		"wheel_1_1_steering","wheel_1_1_damper",
		"wheel_1_2_steering","wheel_1_2_damper",
		"wheel_1_3_steering","wheel_1_3_damper",
		"wheel_1_4_steering","wheel_1_4_damper",

		"wheel_2_1_steering","wheel_2_1_damper",
		"wheel_2_2_steering","wheel_2_2_damper",
		"wheel_2_3_steering","wheel_2_3_damper",
		"wheel_2_4_steering","wheel_2_4_damper",

		"wheel_1_1","wheel_1_1_steering",
		"wheel_1_2","wheel_1_2_steering",
		"wheel_1_3","wheel_1_3_steering",
		"wheel_1_4","wheel_1_4_steering",

		"wheel_2_1","wheel_2_1_steering",
		"wheel_2_2","wheel_2_2_steering",
		"wheel_2_3","wheel_2_3_steering",
		"wheel_2_4","wheel_2_4_steering",

		"wheel_1_1_unhide","wheel_1_1",
		"wheel_1_2_unhide","wheel_1_2",
		"wheel_1_3_unhide","wheel_1_3",
		"wheel_1_4_unhide","wheel_1_4",

		"wheel_2_1_unhide","wheel_2_1",
		"wheel_2_2_unhide","wheel_2_2",
		"wheel_2_3_unhide","wheel_2_3",
		"wheel_2_4_unhide","wheel_2_4",

		"wheel_1_1_hide","wheel_1_1",
		"wheel_1_2_hide","wheel_1_2",
		"wheel_1_3_hide","wheel_1_3",
		"wheel_1_4_hide","wheel_1_4",

		"wheel_2_1_hide","wheel_2_1",
		"wheel_2_2_hide","wheel_2_2",
		"wheel_2_3_hide","wheel_2_3",
		"wheel_2_4_hide","wheel_2_4",

		"OtocVez","",
		"OtocHlaven","OtocVez",

		"damageHide","",
		"damageVez","OtocVez",
		"damageHlaven","OtocHlaven",

		"ukaz_rychlo","",
		"ukaz_rychlo2","",
		"ukaz_rpm","",
		"mph","",
		"rpm","",
		"fuel","",
		"fuel_1","",
		"fuel_01","",
		"fuel_2","",
		"fuel_3","",
		"prop_01","",
		"prop_02","",
		"prop_2","",
		"prop_1","",
		"glass1","damageHide",
		"glass2","damageHide",
		"glass3","damageHide",
		"glass4","damageHide",
	};
};
class civil_car: Car
{
	skeletonInherit="Car";
	skeletonBones[]=
	{
		"reverse_light","",
		"daylights","damageHide",
		"door1","",
		"door2","",
		"glass5","damageHide",
	};
};

};

class CfgModels
{
class Default
{
	sectionsInherit = "";
	sections[] = {};
	skeletonName = "";
};
class Vehicle: Default
{
	sections[] =
	{
		"cislo",
		"grupa",
		"side",
		"sektor",
		"clan",
		"clan_sign",
		"podsvit pristroju",
		"poskozeni",
		"L svetlo",
		"P svetlo",
		"zasleh"
	};
};	

class Car: Vehicle
{
	htMin = 60;		// Minimum half-cooling time (in seconds)
	htMax = 180;	// Maximum half-cooling time (in seconds)
	afMax = 100;	// Maximum temperature in case the model is alive (in celsius)
	mfMax = 8;		// Maximum temperature when the model is moving (in celsius)
	mFact = 1;		// Metabolism factor - number from interval <0, 1> (0 - metabolism has no influence, 1 - metabolism has full influence (no other temperature source will be considered)).
	tBody = 150;	// Metabolism temperature of the model (in celsius)

	sections[]=
	{
		"ammo",
		"zadni svetlo",
		"brzdove svetlo",
		"spz",
		"motor",
		"body",
		"clan",
		"clan_sign",
		"zasleh",
		"Light_R",
		"Light_L",
		"podsvit pristroju",
		"glass1",
		"glass2",
		"glass3",
		"glass4",
		"glass5",
		"glass6",
	};
	skeletonName="Car";
	class Animations
	{
		// destruct START
		class damageHide
		{
			type="hide";
			source="damage";
			selection="damageHide";
			hideValue=1.0;
		};
		class damageHideVez:damageHide
		{
			selection="OtocVez";
		};
		class damageHideHlaven:damageHide
		{
			selection="OtocHlaven";
		};

		// Wheels START
		// Wheels Complete Destruct START
		class wheel_1_1_destruct
		{
			type="hide";
			selection="wheel_1_1_hide";
			source="HitLFWheel";
			minValue = 0; // upravit na 0.99
			maxValue = 1; // upravit na 1.0
			hidevalue = 0.99999;
		};
		class wheel_1_2_destruct:wheel_1_1_destruct {source="HitLBWheel";selection="wheel_1_2_hide";};
		class wheel_1_3_destruct:wheel_1_1_destruct {source="HitLMWheel";selection="wheel_1_3_hide";};
		class wheel_1_4_destruct:wheel_1_1_destruct {source="HitLF2Wheel";selection="wheel_1_4_hide";};

		class wheel_2_1_destruct:wheel_1_1_destruct {source="HitRFWheel";selection="wheel_2_1_hide";};
		class wheel_2_2_destruct:wheel_1_1_destruct {source="HitRBWheel";selection="wheel_2_2_hide";};
		class wheel_2_3_destruct:wheel_1_1_destruct {source="HitRMWheel";selection="wheel_2_3_hide";};
		class wheel_2_4_destruct:wheel_1_1_destruct {source="HitRF2Wheel";selection="wheel_2_4_hide";};

		class wheel_1_1_destruct_unhide
		{
			type="hide";
			selection="wheel_1_1_unhide";
			source="HitLFWheel";
			minValue = 0; 
			maxValue = 1; 
			hidevalue = 0.00000;
			UnHidevalue = 1.00000;
		};
		class wheel_1_2_destruct_unhide:wheel_1_1_destruct_unhide {source="HitLBWheel";selection="wheel_1_2_unhide";};
		class wheel_1_3_destruct_unhide:wheel_1_1_destruct_unhide {source="HitLMWheel";selection="wheel_1_3_unhide";};
		class wheel_1_4_destruct_unhide:wheel_1_1_destruct_unhide {source="HitLF2Wheel";selection="wheel_1_4_unhide";};

		class wheel_2_1_destruct_unhide:wheel_1_1_destruct_unhide {source="HitRFWheel";selection="wheel_2_1_unhide";};
		class wheel_2_2_destruct_unhide:wheel_1_1_destruct_unhide {source="HitRBWheel";selection="wheel_2_2_unhide";};
		class wheel_2_3_destruct_unhide:wheel_1_1_destruct_unhide {source="HitRMWheel";selection="wheel_2_3_unhide";};
		class wheel_2_4_destruct_unhide:wheel_1_1_destruct_unhide {source="HitRF2Wheel";selection="wheel_2_4_unhide";};

		// Wheels Complete Destruct END

		#define DamageOffset 0.2

		// Wheels Damage START
		class wheel_1_1_Damage:wheel_1_1_destruct
		{
			type="translation";
			axis="Basic_Damper_Destruct_Axis";
			memory=1;
			selection="wheel_1_1_damper";
			source="HitLFWheel";
			minValue = 0.0;
			maxValue = 1;
			offset0 = 0;
			offset1 = DamageOffset;
		};
		class wheel_1_2_Damage:wheel_1_1_Damage {source="HitLBWheel";selection="wheel_1_2_damper";};
		class wheel_1_3_Damage:wheel_1_1_Damage {source="HitLMWheel";selection="wheel_1_3_damper";};
		class wheel_1_4_Damage:wheel_1_1_Damage {source="HitLF2Wheel";selection="wheel_1_4_damper";};

		class wheel_2_1_Damage:wheel_1_1_Damage {source="HitRFWheel";selection="wheel_2_1_damper";};
		class wheel_2_2_Damage:wheel_1_1_Damage {source="HitRBWheel";selection="wheel_2_2_damper";};
		class wheel_2_3_Damage:wheel_1_1_Damage {source="HitRMWheel";selection="wheel_2_3_damper";};
		class wheel_2_4_Damage:wheel_1_1_Damage {source="HitRF2Wheel";selection="wheel_2_4_damper";};


		class wheel_1_1_Damper_Damage_BackAnim:wheel_1_1_Damage {selection="wheel_1_1_damper";offset1 = -1.2*DamageOffset;};
		class wheel_1_2_Damper_Damage_BackAnim:wheel_1_1_Damper_Damage_BackAnim {source="HitLBWheel";selection="wheel_1_2_damper";};
		class wheel_1_3_Damper_Damage_BackAnim:wheel_1_1_Damper_Damage_BackAnim {source="HitLMWheel";selection="wheel_1_3_damper";};
		class wheel_1_4_Damper_Damage_BackAnim:wheel_1_1_Damper_Damage_BackAnim {source="HitLF2Wheel";selection="wheel_1_4_damper";};

		class wheel_2_1_Damper_Damage_BackAnim:wheel_1_1_Damper_Damage_BackAnim {source="HitRFWheel";selection="wheel_2_1_damper";};
		class wheel_2_2_Damper_Damage_BackAnim:wheel_1_1_Damper_Damage_BackAnim {source="HitRBWheel";selection="wheel_2_2_damper";};
		class wheel_2_3_Damper_Damage_BackAnim:wheel_1_1_Damper_Damage_BackAnim {source="HitRMWheel";selection="wheel_2_3_damper";};
		class wheel_2_4_Damper_Damage_BackAnim:wheel_1_1_Damper_Damage_BackAnim {source="HitRF2Wheel";selection="wheel_2_4_damper";};

		// Wheels Damage END
		// Wheels END

			//Glass Damage START
			class Glass1_destruct
			{
				type="hide";
				selection="glass1";
				source="HitGlass1";
				minValue = 0; 
				maxValue = 1; 
				hidevalue = 0.99999;
			};
			class Glass2_destruct:Glass1_destruct{selection="glass2";source="HitGlass2";};
			class Glass3_destruct:Glass1_destruct{selection="glass3";source="HitGlass3";};
			class Glass4_destruct:Glass1_destruct{selection="glass4";source="HitGlass4";};
			class Glass5_destruct:Glass1_destruct{selection="glass5";source="HitGlass5";};
			class Glass6_destruct:Glass1_destruct{selection="glass6";source="HitGlass6";};
			//Glass Damage END

		// destruct END
		class Fuel: Rotation
		{
			source="fuel";
			selection="fuel";
			axis="fuel_axis";
			maxValue=1;
			memory=1;
			angle0="rad -110";
			angle1=0;
		};
		class IndicatorSpeed: Rotation
		{
			source="speed";
			selection="mph";
			axis="mph_axis";
			memory=1;
			maxValue=38.900002;
			angle1="rad -265";
		};
		class IndicatorFuel: Rotation
		{
			type="rotation";
			source="fuel";
			selection="fuel_1";
			axis="fuel_1_axis";
			memory=1;
			minValue=0.000000;
			maxValue=1.000000;
			angle0=-0.087266;
			angle1=-1.658063;
		};
		class IndicatorRPM: Rotation
		{
			source="rpm";
			selection="rpm";
			axis="rpm_axis";
			memory=1;
			angle1="rad 80";
		};
		class DrivingWheel: Rotation
		{
			source="drivingWheel";
			selection="drivewheel";
			axis="drivewheel_axis";
			minValue=-1;
			maxValue=1;
			angle0=(rad 80);
			angle1=(rad -80);
		};
		class Steering_1_1
		{
			type="rotationY";
			source="drivingWheel";
			selection="wheel_1_1_steering";
			axis="wheel_1_1_steering_axis";
			memory=1;
			minValue= -1;
			maxValue= 1;
			angle0=1.047198;
			angle1=-1.047198;
		};
		class Steering_2_1: Steering_1_1
		{
			selection="wheel_2_1_steering";
			axis="wheel_2_1_steering_axis";
		};
		class Wheel_1_1
		{
			type="rotationX";
			source="wheel";
			selection="wheel_1_1";
			axis="wheel_1_1_axis";
			memory=1;
			sourceAddress="loop";
			minValue=0;
			maxValue=1;
			angle0=0;
			angle1="rad -360";
		};
		class wheel_2_1: Wheel_1_1
		{
			selection="wheel_2_1";
			axis="wheel_2_1_axis";
		};
		class wheel_1_2: Wheel_1_1
		{
			selection="wheel_1_2";
			axis="wheel_1_2_axis";
		};
		class wheel_1_3: Wheel_1_1
		{
			selection="wheel_1_3";
			axis="wheel_1_3_axis";
		};
		class Wheel_2_2: Wheel_1_1
		{
			selection="wheel_2_2";
			axis="wheel_2_2_axis";
		};
		class Wheel_2_3: Wheel_1_1
		{
			selection="wheel_2_3";
			axis="wheel_2_3_axis";
		};
		class Wheel_1_4: Wheel_1_1
		{
			selection="wheel_1_4";
			axis="wheel_1_4_axis";
		};
		class Wheel_2_4: Wheel_1_1
		{
			selection="wheel_2_4";
			axis="wheel_2_4_axis";
		};
		class Wheel_1_1_Damper
		{
			type="translation";
			source="damper";
			selection="wheel_1_1_damper_land";
			axis="posun wheel_1_1";
			animPeriod = 1;
			minValue="0";
			maxValue="1";
			offset0= "0.5";
			offset1= "-0.5";
			memory=1;
		};
		class wheel_2_1_Damper: Wheel_1_1_Damper
		{
			selection="wheel_2_1_damper_land";
		};
		class wheel_1_2_Damper: Wheel_1_1_Damper
		{
			selection="wheel_1_2_damper_land";
		};
		class Wheel_2_2_Damper: Wheel_1_1_Damper
		{
			selection="wheel_2_2_damper_land";
		};
		class daylights
		{
			type="hide";
			source="rpm";
			selection="daylights";
			minValue=-0.8;
			maxValue=0.2;
			unhidevalue=1;
			sourceAddress="clamp";
		};

		class reverse_light
		{
			type="Hide";
			selection="reverse_light";
			sourceAddress="clamp";
			source="Gear";
			minValue = -1;
			maxValue = 0;
			hideValue = "0.2";	
		};			
	};
};

class DAR_ImpalaINT: Car
{
	skeletonName = "civil_car";
	sectionsInherit = "Car";
	sections[]=
	{
		"body",
		"karoserie",
		"palivo",
	};
	class Animations: Animations
	{
		class wheel_1_1_Damage: wheel_1_1_Damage{offset1=0.18000001;};
		class wheel_1_2_Damage: wheel_1_2_Damage{offset1=0.18000001;};
		class wheel_2_1_Damage: wheel_2_1_Damage{offset1=0.18000001;};
		class wheel_2_2_Damage: wheel_2_2_Damage{offset1=0.18000001;};

		class wheel_1_1_Damper_Damage_BackAnim: wheel_1_1_Damper_Damage_BackAnim{offset1=-0.18000001;};
		class wheel_1_2_Damper_Damage_BackAnim: wheel_1_2_Damper_Damage_BackAnim{offset1=-0.18000001;};
		class wheel_2_1_Damper_Damage_BackAnim: wheel_2_1_Damper_Damage_BackAnim{offset1=-0.18000001;};
		class wheel_2_2_Damper_Damage_BackAnim: wheel_2_2_Damper_Damage_BackAnim{offset1=-0.18000001;};

		class DrivingWheel
		{
			type="rotation";
			source="drivingWheel";
			selection="drivewheel";
			axis="drivewheel_axis";
			memory=1;
			minValue=-1;
			maxValue=1;
			angle0=(rad 70);
			angle1=(rad -70);
		};
		class Steering_1_1
		{
			type="rotationY";
			source="drivingWheel";
			selection="wheel_1_1_steering";
			axis="wheel_1_1_steering_axis";
			memory=1;
			minValue="rad -90";
			maxValue="rad +90";
			angle0=1.0471981;
			angle1=-1.0471981;
		};
		class Steering_2_1: Steering_1_1
		{
			selection="wheel_2_1_steering";
			axis="wheel_2_1_steering_axis";
			angle0=1.0471981;
			angle1=-1.0471981;
		};
		class IndicatorSpeed: Rotation
		{
			source="speed";
			selection="mph";
			axis="mph_axis";
			memory=1;
			maxValue=28;
			angle0=0.17453299;
			angle1=-3.141593;
		};
		class IndicatorRPM: Rotation
		{
			type="rotation";
			source="rpm";
			selection="rpm";
			axis="rpm_axis";
			memory=1;
			minValue=0;
			maxValue=7500;
			angle0=(rad 0);
			angle1=(rad 250);
		};				
		class fuel
		{
			type="rotation";
			source="fuel";
			selection="fuel";
			axis="fuel_axis";
			memory=1;
			minValue=0;
			maxValue=1;
			angle0=0;
			angle1="rad +55";
		};
		class prop_01
		{
			type="rotation";
			source="rpm";
			selection="prop_1";
			axis="prop_1_axis";
			memory=1;
			minValue=1000;
			maxValue=7000;
			angle0="rad 30";
			angle1="rad 35";
		};

		class daylights
		{
			type="hide";
			source="rpm";
			selection="daylights";
			minValue=-0.8;
			maxValue=0.2;
			unhidevalue=1;
			sourceAddress="clamp";
		};

		class reverse_light
		{
			type="Hide";
			selection="reverse_light";
			sourceAddress="clamp";
			source="Gear";
			minValue = -1;
			maxValue = 0;
			hideValue = "0.2";	
		};

		class damageHidedoor1:damageHide
		{
			selection="door1";
		};
		class damageHidedoor2:damageHide
		{
			selection="door2";
		};	

		class Glass5_destruct
		{
			type="hide";
			selection="glass5";
			source="HitGlass5";
			minValue = 0;
			maxValue = 1;
			hidevalue = 0.99999;
		};	
		class Wheel_1_1_Damper: Wheel_1_1_Damper
		{
			type="translation";
			source="damper";
			selection="wheel_1_1_damper_land";
			axis="posun wheel_1_1";
			animPeriod = 1;
			minValue="0";
			maxValue="1";
			offset0= "0.5";
			offset1= "-0.5";
			memory=1;
		};
		class wheel_2_1_Damper: Wheel_1_1_Damper
		{
			selection="wheel_2_1_damper_land";			
		};
		class wheel_1_2_Damper: Wheel_1_1_Damper
		{
			selection="wheel_1_2_damper_land";						
		};
		class Wheel_2_2_Damper: Wheel_1_1_Damper
		{
			selection="wheel_2_2_damper_land";		
		};			
	};
};
};

PHYS-X . HPP


	thrustDelay            	= 0.2; 		/// initial delay to cause lesser slip when on 1st gear - thrust goes from zero to full in this time
	brakeIdleSpeed         	= 1.78; 	/// under what speed (in m/s) does the brake apply for a vehicle without thrust
	maxSpeed               	= 150; 		/// vehicle can go a bit over, but dramatically decreases thrust
	fuelCapacity           	= 90; 
	wheelCircumference     	= 2.277; 	/// diameter of 725

	antiRollbarForceCoef	= 0.5; 	/// how strong is the anti-roll bar of vehicle preventing it to lose grip in turns (not any magical stuff, real ARB)
	antiRollbarForceLimit	= 0.5; 	/// highest possible force of ARB
	antiRollbarSpeedMin 	= 20; 	/// the roll bar force gets from zero to full in range of min and max speed
	antiRollbarSpeedMax		= 80;  	/// this simulates losing grip at high speed turns

	class complexGearbox
	{	
		GearboxRatios[]    = {"R1",-3.231,"N",0,"D1",2.462,"D2",1.870,"D3",1.241,"D4",0.970,"D5",0.711};
		TransmissionRatios[] = {"High",4.111}; // Optional: defines transmission ratios (for example, High and Low range as commonly found in offroad vehicles)
		gearBoxMode        = "auto"; //gearbox can be of type: full-auto (only requires 'W' or 'S'), auto (requires shift between drive and reverse), semi-auto, manual
		moveOffGear        = 1; // defines what gear an automatic or semi-automatic gearbox will move off from stationary in. 1 by default.
		driveString        = "D"; // string to display in the HUD for forward gears.
		neutralString      = "N"; // string to display in the HUD for neutral gear.
		reverseString      = "R"; // string to display in the HUD for reverse gears.
	};		

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/// PhysX parameters
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	// <Description>: Defines simulation type of the vehicle. PhysX simulation ends with letter "x", "carx", "tankx" ...
	// <Type>: string
	// <Default>: (required)
	simulation = "carx";

	// <Description>: Defines how much dampers react to random little bumps on surface. It's only visual effect, doesn't influence drive simulation,
	// only taken into account when calculating damper animation.
	// <Type>: float
	// <Default>: 0.0
	dampersBumpCoef = 0.05;

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Differential parameters
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	// <Description>: A number of differential types are supported: 4-wheel drive with open differential, 4-wheel drive with limited slip, front-wheel drive 
	// with open differential, front-wheel drive with limited slip, rear-wheel drive with open differential, rear-wheel drive with limited slip.
	// <Type>: string; acceptable values: "all_open", "all_limited", "front_open", "front_limited", "rear_open", "rear_limited"
	// <Default>: "all_limited"
	differentialType = "front_limited";

	// <Description>: Ratio of engine power that goes to front wheels out of total power for 4-wheel drive differentials. 
	// Choosing a value greater than 0.5 delivers more torque to the front wheels, while choosing a value less than 0.5 
	// delivers more torque to the rear wheels. This value is ignored for front-wheel drive and rear-wheel drive differentials.
	// <Type>: float
	// <Default>: 0.5
	frontRearSplit = 0.5;

	// <Description>: This is the largest possible relative difference between speed of front wheels. It helps to have outside wheels a bit faster
	// during the turns, but it prevents the faster wheel to take all the power while sliding. The power is shifted to slower wheel once the value is reached.
	// Locked differential has value of 1, the softer is the lock the greater should the value be.
	// This value is ignored except for front-wheel drive or four wheel drive with limited slip.
	// A good starting value is around 1.3.
	// <Type>: 
	// <Default>: 
	frontBias = 1.5;

	// <Description>: This is similar to frontBias except that it refers to the rear wheels.
	// This value is ignored except for rear-wheel drive or four wheel drive with limited slip.
	// A good starting value is around 1.3.
	// <Type>: float
	// <Default>: 1.3
	rearBias = 1.3;

	// <Description>: This value is similar to the frontBias and rearBias, except that it refers to the sum of the front wheel rotation speeds and the sum 
	// of the rear wheel rotation speeds.
	// This value is ignored except for four wheel drive with limited slip.
	// A good starting value is around 1.3.
	// <Type>: float
	// <Default>: 1.3
	centreBias = 1.3;

	// <Description>: How fast is engine power distributed to the wheels. Stronger values mean more aggressive drive performance inclining to
	// slip a little while changing gears while weaker values are better for comfortable seamless ride.
	// <Type>: float
	// <Default>: 10.0
	clutchStrength = 15.0;

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Engine parameters
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	// <Description>: Power of the engine in kW.
	// <Type>: float
	// <Default>: (required)
	enginePower = 110; 


	// <Description>: This is the maximum rotational speed of the engine expressed in radians per second. It could be calculated from maximum 
	// engine RPM like this: 
	// maxOmega = (maxRpm*2*Pi)/60.
	// <Type>: float
	// <Default>: 600 which is cca 6000 rounds per minute.
	maxOmega = 720;

	// <Description>: This is the maximum torque that is ever available from the engine. This is expressed in Newton metres. 
	// <Type>: float
	// <Default>: value calculated from enginePower according to [url]http://en.wikipedia.org/wiki/Horsepower#Relationship_with_torque[/url]
	peakTorque = 350;

	// <Description>: These three values describe internal damping of the engine. Bigger values mean greater damping. Clutch disengaged value 
	// is used while shifting gears, engine interpolates between clutch engaged and full throttle values according to throttle input.
	// We tend to use slightly lower clutch engaged values because it allows cars to turn more smoothly.
	// Typical values in range (0.25,3). The simulation can become unstable with damping rates of 0.
	// <Type>: float, float, float
	// <Default>: 0.08, 2.0, 0.35
	dampingRateFullThrottle = 0.08;
	dampingRateZeroThrottleClutchEngaged = 0.35;
	dampingRateZeroThrottleClutchDisengaged = 0.35;		

	// <Description>: This is a graph of peak torque versus engine rotational speed.
	// The x-axis of the curve is the relative engine speed; that is, the engine speed divided by the maximum engine speed. The y-axis of the curve is a 
	// multiplier in range (0,1) that is used to scale the peak torque. It is good to keep the values in mind while setting changeGearMinEffectivity.
	// <Type>: Array[i][2] where i = number of samples, maximum 8;
	// <Default>: {{0.0, 0.8}, {0.33, 1.0}, {1.0, 0.8}}
	torqueCurve[] = {{0.000, 0.000}, {0.178, 0.800}, {0.250, 1.0}, {0.461, 0.900}, {0.900, 0.800}, {1.000, 0.300}};

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Gearbox parameters
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	// <Description>: Value of minimal gear effectivity to hold current gear. If there is better gear and effectivity is below this value then change gear.
	// <Range>: (0,1)
	// <Type>: Array[i] where i = number of gears
	// <Default>: 0.95 for every value (Neutral = 0.15 Not sure how important this is but we want to kick out of neutral very quickly)
	changeGearMinEffectivity[]   = {0.95, 0.15, 0.95, 0.95, 0.95, 0.95, 0.95};

	// <Description>: The switch time describes how long it takes (in seconds) for a gear change to be completed. This needs to be set to aggresive shifting
	// or it would cause issues while trying to run aggressively (mainly during evading the enemies).
	// <Type>: float
	// <Default>: 0.01
	switchTime = 0.31;

	// <Description>: Set the latency time of the gearbox, specified in s.
	// This is used to prevent instant shifting after changing gears - there is some power loss during gear change and it could seem that
	// previous gear is better for a brief time after shifting.
	// <Type>: float
	// <Default>: 2.0
	latency = 1.0;

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Wheels parameters
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	class Wheels
	{
		class LF
		{
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			// General parameters
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

			// <Description>: Name of the bone, used for wheel and suspension animations.
			// <Type>: string
			// <Default>: ""
			boneName = "wheel_1_1_damper";

			// <Description>: If true, wheel is steerable, false - wheel is fixed.
			// <Type>: bool
			// <Default>: (required)
			steering = true;

			// <Description>: Defines if wheel is on the right or left side of the vehicle
			// <Type>: string
			// <Default>: "right"
			side = "left";

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			// Wheel PX parameters
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

			// <Description>: Center of the wheel (axis)
			// <Type>: memory point
			// <Default>: (required)
			center   = "wheel_1_1_axis";

			// <Description>: Point on the outside rim of the tire, used to calculate radius of the wheel (distance between center and boundary).
			// <Type>: memory point
			// <Default>: (required)
			boundary = "wheel_1_1_bound";

			// <Description>: This is the weight in kg of wheel including both rim and tyre.
			// <Type>: float
			// <Default>: 10.0
			mass = 20;

			// <Description>: This is the wheel's moment of inertia about the rolling axis. Smaller values result in more slips in aggresive driving
			// while larger hamper the gain of speed. Good base to start with is this formula:
			// MOI = 0.5 * Mass * Radius * Radius
			// Some tweaking is needed after the computation, but it is still better than nothing.
			// <Type>: float
			// <Default>: 0.5 * WheelMass * WheelRadius * WheelRadius
			MOI = 3.3;

			// <Description>:The damping rate describes the rate at which a freely spinning wheel loses rotational speed. 
			// Values in range (0.25, 2) seem like sensible values. Experimentation is always a good idea, even outside this range.
			// <Type>: float
			// <Default>: 0.1
			dampingRate = 0.5;

			// <Description>: This is the value of the torque applied to the wheel when the brakes are maximally applied. Higher torques will lock the wheel 
			// quicker when braking, while lower torques will take longer to lock the wheel.
			// A value of around 1500 is a good starting point for a vanilla wheel but a google search will reveal typical braking torques. One difficulty is 
			// that these are often expressed by manufacturers as braking horsepower or in "pounds inches". The values required here are in "Newton metres".
			// <Type>: float
			// <Default>: 2500
			maxBrakeTorque = 2500;

			// <Description>: This is the same as the max brake torque except for the handbrake rather than the brake. Typically, for a 4-wheeled car, 
			// the handbrake is stronger than the brake and is only applied to the rear wheels. A value of 4000 for the rear wheels is a good starting point, 
			// while a value of 0 is necessary for the front wheels to make sure they do not react to the handbrake.
			// <Type>: float
			// <Default>: 2*maxBrakeTorque
			maxHandBrakeTorque = 0;

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			// Wheel simulation parameters
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

			// <Description>: This is the direction of the suspension in the downward direction in the rest configuration of the vehicle. A vector that 
			// points straight downwards is a good starting point.
			// <Type>: Array[3]
			// <Default>: {0, -1, 0}
			suspTravelDirection[] = {0, -1, 0};

			// <Description>: This is the application point of the suspension force.
			// <Type>: memory point
			// <Default>: center
			suspForceAppPointOffset = "wheel_1_1_axis";

			// <Description>: This is almost the same as the suspension force app point except for the lateral and longitudinal forces that develop on the tire.
			// A good starting point is to duplicate the suspension force application point.
			// <Type>: memory point
			// <Default>: suspForceAppPointOffset
			tireForceAppPointOffset = "wheel_1_1_axis";

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			// Suspension parameters
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

			// <Description>: These values describe the maximum compression and elongation in metres that the spring can support.
			// <Type>: float
			// <Default>: 0.15
			maxCompression = 0.1;
			mMaxDroop = 0.15;

			// <Description>: This is the mass in kg that is supported by the suspension spring.
			// <Type>: float
			// <Default>: vehicleMass/numberOfWheels
			sprungMass = 350.0;

			// <Description>: This is the strength of the suspension spring in Newtons per metre.
			//   springStrength = naturalFrequency * naturalFrequency * sprungMass
			// <Type>: float
			// <Default>: sprungMass*5,0*5,0
			springStrength = 22600;

			// <Description>: This describes the rate at which the spring dissipates the energy stored in the spring.
			// Basic equiation for this is
			//  springDamperRate = dampingRatio * 2 * sqrt(springStrength * sprungMass)
			// where dampingRatio = 1 mean critical damping (critically damped pendulum should get back to start point in every swing)
			// <Type>: float
			// <Default>: 0,4*2*sqrt(springStrength*sprungMass)
			springDamperRate = 8680;

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			// Tire parameters
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

			// <Description>: Increasing this value will result in the tire attempting to generate more longitudinal force when the tire is slipping.  
			// Typically, increasing longitudinal stiffness will help the car accelerate and brake. The total tire force available is limited by the 
			// load on the tire so be aware that increases in this value might have no effect or even come at the expense of reduced lateral force.
			// <Type>: float 
			// <Default>: 10000
			longitudinalStiffnessPerUnitGravity = 100000;

			// <Description>: These values together describe the lateral stiffness per unit lateral slip (in radians) of the tire.
			// <Type>: float, float
			// <Default>: 25, 180
			latStiffX = 25;
			latStiffY = 18000;

			// <Description>: These six values describe a graph of friction as a function of longitudinal slip. 
			// A good starting point for this is a flat graph of friction vs slip with these values:
			// frictionVsSlipGraph[0][0]=0.0
			// frictionVsSlipGraph[0][1]=1.0
			// frictionVsSlipGraph[1][0]=0.5
			// frictionVsSlipGraph[1][1]=1.0
			// frictionVsSlipGraph[2][0]=1.0
			// frictionVsSlipGraph[2][1]=1.0
			// <Type>: Array[3][2]
			// <Default>: {{0, 1}, {0.5, 1}, {1,1}}
			frictionVsSlipGraph[] = {{0, 1}, {0.5, 1}, {1,1}};
		};
		class LR : LF
		{
			boneName = "wheel_1_2_damper";
			steering = false;
			center   = "wheel_1_2_axis";
			boundary = "wheel_1_2_bound";
			suspForceAppPointOffset = "wheel_1_2_axis";
			tireForceAppPointOffset = "wheel_1_2_axis";
			maxHandBrakeTorque = 3000;
			latStiffY = 180;	
			sprungMass = 190.0;
			springStrength = 4750;
			springDamperRate = 1760;				
		};
		class RF : LF
		{
			boneName = "wheel_2_1_damper";
			center   = "wheel_2_1_axis";
			boundary = "wheel_2_1_bound";
			suspForceAppPointOffset = "wheel_2_1_axis";
			tireForceAppPointOffset = "wheel_2_1_axis";
			steering = true;
			side = "right";
		};
		class RR : RF
		{
			boneName = "wheel_2_2_damper";
			steering = false;
			center   = "wheel_2_2_axis";
			boundary = "wheel_2_2_bound";
			suspForceAppPointOffset = "wheel_2_2_axis";
			tireForceAppPointOffset = "wheel_2_2_axis";
			maxHandBrakeTorque = 3000;
			latStiffY = 180;				
			sprungMass = 190.0;
			springStrength = 4750;
			springDamperRate = 1760;					
		};
	};

Share this post


Link to post
Share on other sites

Adjust your "posun wheel_X_X" memory points. One should be at the center of the wheel like the wheel axis an the other should be above it. The one above is the one to adjust in Y-axis. Well thats what I adjusted to fix my floating problem.

Share this post


Link to post
Share on other sites

Hello:

Thank you for a quick reply. I have tweaked those points endlessly, moving the top one both up and down to no result. Should I be moving that point on the top up or down to fix the issue?

Also, the suspension is still messed up. It's hard to explain, so I did a awful drawing.

suspensionproblems.png

Share this post


Link to post
Share on other sites

Think I was wrong with what I posted. Um hit me up on skype if you want maybe we can resolve this issue.

Share this post


Link to post
Share on other sites

I have same problem with my APC - its floating above the ground few cm. I tried moving land contact points, wheel_X_Y_bound memory points, nothing works. I'll be glad if someone can help and post solution here. Thanks

Share this post


Link to post
Share on other sites

Hello: I'll update this topic as I did fix the issue, although I do not definitively know how. I simply tweaked the values in the Phys-x area of the config a ton until I was happy with it. In each wheel there are these values:

sprungMass = 550;
springStrength = 90875;
springDamperRate = 20740;

These helped me fix it, along with working on a balanced Geo LOD and ensuring it was weighted correctly.

Basically, it all comes down to tweaking such as wheel circumference, suspension and so forth until it is fixed. I wish there was a definitive solution I could give you, but every vehicle is much different depending on it's Phys-x parameters so unfortunately I cannot.

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×