Example #1
0
NxActor* CreateBoard(const NxVec3& pos)
{
	NxActor* actor = CreateBox(pos + NxVec3(0,0.5,0), NxVec3(1,0.25,0.5), 10);
	actor->raiseBodyFlag(NX_BF_FROZEN_ROT_X);
	actor->setAngularDamping(0.5);

	// Left wheel
	NxWheelDesc wheelDesc;
	//wheelDesc.wheelAxis.set(0,0,1);
	//wheelDesc.downAxis.set(0,-1,0);
    wheelDesc.wheelApproximation = 10;
	wheelDesc.wheelRadius = 0.5;
	wheelDesc.wheelWidth = 0.1;
	wheelDesc.wheelSuspension = 0.5;
//	wheelDesc.wheelSuspension = 1.0;
	wheelDesc.springRestitution = 7000;
	wheelDesc.springDamping = 0;
	wheelDesc.springBias = 0;  
//	wheelDesc.springRestitution = 20;
//	wheelDesc.springDamping = 0.5;
//	wheelDesc.springBias = 0; 
	wheelDesc.maxBrakeForce = 1;
	wheelDesc.frictionToFront = 0.1;
	wheelDesc.frictionToSide = 0.99;
	wheelDesc.position = NxVec3(1.5,0.5,0);
	wheelDesc.wheelFlags = NX_WF_USE_WHEELSHAPE | NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
		                   NX_WF_AFFECTED_BY_HANDBRAKE | NX_WF_STEERABLE_INPUT;

    wheel1 = AddWheelToActor(actor, &wheelDesc);

	// Right wheel
	NxWheelDesc wheelDesc2;
	//wheelDesc2.wheelAxis.set(0,0,1);
	//wheelDesc2.downAxis.set(0,-1,0);
    wheelDesc2.wheelApproximation = 10;
	wheelDesc2.wheelRadius = 0.5;
	wheelDesc2.wheelWidth = 0.1;
	wheelDesc2.wheelSuspension = 0.5;
//	wheelDesc2.wheelSuspension = 1.0;  
	wheelDesc2.springRestitution = 7000;
	wheelDesc2.springDamping = 0;
	wheelDesc2.springBias = 0;
//	wheelDesc2.springRestitution = 20;
//	wheelDesc2.springDamping = 0.5;
//	wheelDesc2.springBias = 0;  
	wheelDesc2.maxBrakeForce = 1;
	wheelDesc2.frictionToFront = 0.1;
	wheelDesc2.frictionToSide = 0.99;
	wheelDesc2.position = NxVec3(-1.5,0.5,0);
	wheelDesc2.wheelFlags = NX_WF_USE_WHEELSHAPE | NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
		                    NX_WF_AFFECTED_BY_HANDBRAKE | NX_WF_STEERABLE_INPUT;

    wheel2 = AddWheelToActor(actor, &wheelDesc2);

	return actor;
}
Example #2
0
VehicleController::VehicleController(Vec3 pos, VehicleEngine* vehEngine, VehicleParams *vehParams, VehicleParamsEx *vehParamsEx, bool steerableWheelsFront)
{
	m_forward = Vec3(0, 0, 0);

	m_scene = core.dynamics->getScene();
	m_vehiclePose = new VehiclePose;
	m_vehicleParams = vehParams;
	m_vehicleParamsEx = vehParamsEx;
	m_vehicleEngine = vehEngine;
	m_actor = NULL;

	m_wheelFrontLeft = NULL;
	m_wheelFrontRight = NULL;
	m_wheelRearLeft = NULL;
	m_wheelRearRight = NULL;

	m_poseGiven = false;

	m_setCurrentSteerAngle = false;
	m_setCurrentMotorTorque = false;
	m_setCurrentBrakeTorque = false;

	m_currentSteerAngle = 0.0f;
	m_currentMotorTorque = 0.0f;
	m_currentBrakeTorque = 0.0f;

	m_steerableWheelsFront = steerableWheelsFront;

	switch(m_vehicleParams->wheelDriveType)
	{
		case 0:
			m_wheelDriveType = WDT_2WD;
			break;
		case 1:
			m_wheelDriveType = WDT_4WD;
			break;
		case 2:
			m_wheelDriveType = WDT_FWD;
			break;
		default:
			m_wheelDriveType = WDT_2WD;
	}

	D3DXMatrixIdentity(&m_vehiclePose->matChassis);
	D3DXMatrixIdentity(&m_vehiclePose->matFrontLeftWheel);
	D3DXMatrixIdentity(&m_vehiclePose->matFrontRightWheel);
	D3DXMatrixIdentity(&m_vehiclePose->matRearLeftWheel);
	D3DXMatrixIdentity(&m_vehiclePose->matRearRightWheel);

	m_actor = core.dynamics->createBox(NxVec3(pos), NxVec3(m_vehicleParams->chassisDimm), m_vehicleParams->chassisDensity);
	SetActorCollisionGroup(m_actor, GROUP_COLLIDABLE_NON_PUSHABLE);

	//Wheel material globals
	NxMaterial* wsm = NULL;

	NxTireFunctionDesc lngTFD;
	lngTFD.extremumSlip = 1.0f;
	lngTFD.extremumValue = 0.02f;
	lngTFD.asymptoteSlip = 2.0f;
	lngTFD.asymptoteValue = 0.01f;	
	lngTFD.stiffnessFactor = 100.0f;

	NxTireFunctionDesc latTFD;
	latTFD.extremumSlip = 1.0f;
	latTFD.extremumValue = 0.02f;
	latTFD.asymptoteSlip = 2.0f;
	latTFD.asymptoteValue = 0.01f;	
	latTFD.stiffnessFactor = 100.0f;

	NxTireFunctionDesc slipTFD;
	slipTFD.extremumSlip = 1.0f;
	slipTFD.extremumValue = 0.02f;
	slipTFD.asymptoteSlip = 2.0f;
	slipTFD.asymptoteValue = 0.01f;	
	slipTFD.stiffnessFactor = 100.0f;  

	NxTireFunctionDesc medTFD;
	medTFD.extremumSlip = 1.0f;
	medTFD.extremumValue = 0.02f;
	medTFD.asymptoteSlip = 2.0f;
	medTFD.asymptoteValue = 0.01f;	
	medTFD.stiffnessFactor = 100.0f;

	// Front left wheel
	NxWheelDesc wheelDesc;
	wheelDesc.frictionToFront = 3.0f;
	wheelDesc.frictionToSide = 3.0f;


	/*wheelDesc4.wheelSuspension = wheelDesc3.wheelSuspension = wheelDesc2.wheelSuspension = wheelDesc.wheelSuspension = 0.0001;
	wheelDesc4.springRestitution = wheelDesc3.springRestitution = wheelDesc2.springRestitution = wheelDesc.springRestitution = 0.0001;
	wheelDesc4.springDamping = wheelDesc3.springDamping = wheelDesc2.springDamping = wheelDesc.springDamping = 0.001;
	wheelDesc4.springBias = wheelDesc3.springBias = wheelDesc2.springBias = wheelDesc.springBias = 0.001;
	wheelDesc4.maxBrakeForce = wheelDesc3.maxBrakeForce = wheelDesc2.maxBrakeForce = wheelDesc.maxBrakeForce = 0.01;*/

	if(!m_vehicleParamsEx)
	{
		wheelDesc.wheelSuspension = 0.05f;
		wheelDesc.springRestitution = 1000.0f;
		wheelDesc.springDamping = 0.5f / 10000000000000;
		wheelDesc.springBias = 1.0f / 10000000000000;
		wheelDesc.maxBrakeForce = 0.01f; // 100;
		/*
		wheelDesc4.wheelSuspension = wheelDesc3.wheelSuspension = wheelDesc2.wheelSuspension = wheelDesc.wheelSuspension = 0.5f;
		wheelDesc4.springRestitution = wheelDesc3.springRestitution = wheelDesc2.springRestitution = wheelDesc.springRestitution = 1000.0f;
		wheelDesc4.springDamping = wheelDesc3.springDamping = wheelDesc2.springDamping = wheelDesc.springDamping = 0.5f / 1;
		wheelDesc4.springBias = wheelDesc3.springBias = wheelDesc2.springBias = wheelDesc.springBias = 1.0f / 100000;
		wheelDesc4.maxBrakeForce = wheelDesc3.maxBrakeForce = wheelDesc2.maxBrakeForce = wheelDesc.maxBrakeForce = 0.01f; // 100;*/
	}
	else
	{
		wheelDesc.frictionToFront = m_vehicleParamsEx->frictionToFront;
		wheelDesc.frictionToSide = m_vehicleParamsEx->frictionToSide;

		wheelDesc.wheelSuspension = m_vehicleParamsEx->wheelSuspension;
		wheelDesc.springRestitution = m_vehicleParamsEx->springRestitution;
		wheelDesc.springDamping = m_vehicleParamsEx->springDamping;
		wheelDesc.springBias = m_vehicleParamsEx->springBias;
		wheelDesc.maxBrakeForce = m_vehicleParamsEx->maxBrakeForce; // 100;
	}


	wheelDesc.wheelApproximation = 0;
	wheelDesc.wheelRadius = m_vehicleParams->frontWheelsRadius;
	wheelDesc.wheelWidth = m_vehicleParams->frontWheelsWidth;  // 0.1
	wheelDesc.position = NxVec3(m_vehicleParams->posFrontLeftWheel);
	wheelDesc.wheelFlags = NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
						   NX_WF_STEERABLE_INPUT | NX_WF_CLAMPED_FRICTION;

	// Front right wheel
	NxWheelDesc wheelDesc2 = wheelDesc;
	wheelDesc2.wheelRadius = m_vehicleParams->frontWheelsRadius;
	wheelDesc2.wheelWidth = m_vehicleParams->frontWheelsWidth;  // 0.1
	wheelDesc2.position = NxVec3(m_vehicleParams->posFrontRightWheel);
	
	// Rear left wheel
	NxWheelDesc wheelDesc3 = wheelDesc;
	wheelDesc3.wheelRadius = m_vehicleParams->rearWheelsRadius;
	wheelDesc3.wheelWidth = m_vehicleParams->rearWheelsWidth;  // 0.1
	wheelDesc3.position = NxVec3(m_vehicleParams->posRearLeftWheel);
	
	// Rear right wheel
	NxWheelDesc wheelDesc4 = wheelDesc;
	wheelDesc4.wheelRadius = m_vehicleParams->rearWheelsRadius;
	wheelDesc4.wheelWidth = m_vehicleParams->rearWheelsWidth;  // 0.1
	wheelDesc4.position = NxVec3(m_vehicleParams->posRearRightWheel);


	m_wheelFrontLeft = AddWheelToActor(m_actor, &wheelDesc);
	m_wheelFrontRight = AddWheelToActor(m_actor, &wheelDesc2);
	m_wheelRearLeft = AddWheelToActor(m_actor, &wheelDesc3);
	m_wheelRearRight = AddWheelToActor(m_actor, &wheelDesc4);

	m_wheelFrontLeft->userData = (void*)new ShapeUserData;
	m_wheelFrontRight->userData = (void*)new ShapeUserData;
	m_wheelRearLeft->userData = (void*)new ShapeUserData;
	m_wheelRearRight->userData = (void*)new ShapeUserData;

	((ShapeUserData*)m_wheelFrontLeft->userData)->vehicleActor = m_actor;
	((ShapeUserData*)m_wheelFrontRight->userData)->vehicleActor = m_actor;
	((ShapeUserData*)m_wheelRearLeft->userData)->vehicleActor = m_actor;
	((ShapeUserData*)m_wheelRearRight->userData)->vehicleActor = m_actor;

	m_wheelFrontLeft->setWheelFlags(m_wheelFrontLeft->getWheelFlags() | NX_WF_INPUT_LAT_SLIPVELOCITY  );
	m_wheelFrontRight->setWheelFlags(m_wheelFrontRight->getWheelFlags() | NX_WF_INPUT_LAT_SLIPVELOCITY  );
	m_wheelRearLeft->setWheelFlags(m_wheelRearLeft->getWheelFlags() | NX_WF_INPUT_LAT_SLIPVELOCITY  );
	m_wheelRearRight->setWheelFlags(m_wheelRearRight->getWheelFlags() | NX_WF_INPUT_LAT_SLIPVELOCITY  );

	// LOWER THE CENTER OF MASS
	NxVec3 massPos = m_actor->getCMassLocalPosition();
	massPos.y = m_vehicleParams->posFrontLeftWheel.y - m_vehicleParams->frontWheelsRadius;
	m_actor->setCMassOffsetLocalPosition(massPos);
	m_actor->wakeUp(1e30);
	//stopMotorAndBreak();
}
Example #3
0
NxActor* CreateTrike(const NxVec3& pos)
{
	NxActor* actor = CreateBox(pos + NxVec3(0,0.5,0), NxVec3(2,0.25,0.75), 10);

	NxTireFunctionDesc lngTFD;
	lngTFD.extremumSlip = 1.0f;
	lngTFD.extremumValue = 0.02f;
	lngTFD.asymptoteSlip = 2.0f;
	lngTFD.asymptoteValue = 0.01f;	
	lngTFD.stiffnessFactor = 1000000.0f;

	NxTireFunctionDesc latTFD;
	latTFD.extremumSlip = 1.0f;
	latTFD.extremumValue = 0.02f;
	latTFD.asymptoteSlip = 2.0f;
	latTFD.asymptoteValue = 0.01f;	
	latTFD.stiffnessFactor = 1000000.0f;

	NxTireFunctionDesc slipTFD;
	slipTFD.extremumSlip = 1.0f;
	slipTFD.extremumValue = 0.02f;
	slipTFD.asymptoteSlip = 2.0f;
	slipTFD.asymptoteValue = 0.01f;	
	slipTFD.stiffnessFactor = 100.0f;

	// Front wheel
	NxWheelDesc wheelDesc;
    wheelDesc.wheelApproximation = 10;
	wheelDesc.wheelRadius = 0.5;
	wheelDesc.wheelWidth = 0.3;  // 0.1
	wheelDesc.wheelSuspension = 1.0;  
	wheelDesc.springRestitution = 100;
	wheelDesc.springDamping = 0.5;
	wheelDesc.springBias = 0;  
	wheelDesc.maxBrakeForce = 1;
	wheelDesc.position = NxVec3(2.5,0.5,0);
	wheelDesc.wheelFlags = NX_WF_USE_WHEELSHAPE | NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
		                    NX_WF_AFFECTED_BY_HANDBRAKE | NX_WF_STEERABLE_INPUT;
    wheel1 = AddWheelToActor(actor, &wheelDesc);

	// Rear left wheel
	NxWheelDesc wheelDesc2;
    wheelDesc2.wheelApproximation = 10;
	wheelDesc2.wheelRadius = 0.5;
	wheelDesc2.wheelWidth = 0.3;  // 0.1
	wheelDesc2.wheelSuspension = 1.0;  
	wheelDesc2.springRestitution = 100;
	wheelDesc2.springDamping = 0.5;
	wheelDesc2.springBias = 0;  
	wheelDesc2.maxBrakeForce = 1;	
	wheelDesc2.position = NxVec3(-1.5,0.5,-1);
	wheelDesc2.wheelFlags = NX_WF_USE_WHEELSHAPE | NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
		                    NX_WF_AFFECTED_BY_HANDBRAKE | NX_WF_STEERABLE_INPUT; 
    wheel2 = AddWheelToActor(actor, &wheelDesc2);

	// Rear right wheel
	NxWheelDesc wheelDesc3;
    wheelDesc3.wheelApproximation = 10;
	wheelDesc3.wheelRadius = 0.5;
	wheelDesc3.wheelWidth = 0.3;  // 0.1
	wheelDesc3.wheelSuspension = 1.0;  
	wheelDesc3.springRestitution = 100;
	wheelDesc3.springDamping = 0.5;
	wheelDesc3.springBias = 0;  
	wheelDesc3.maxBrakeForce = 1;
	wheelDesc3.position = NxVec3(-1.5,0.5,1);
	wheelDesc3.wheelFlags = NX_WF_USE_WHEELSHAPE | NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
		                    NX_WF_AFFECTED_BY_HANDBRAKE | NX_WF_STEERABLE_INPUT;
    wheel3 = AddWheelToActor(actor, &wheelDesc3);

    // LOWER THE CENTER OF MASS
    NxVec3 massPos = actor->getCMassLocalPosition();
    massPos.y -= 1;
    actor->setCMassOffsetLocalPosition(massPos);

	return actor;
}
Example #4
0
Tractor::Tractor(Dynamics *dyn, NxVec3 pos, string fname)
{
	m_vehicleDimms = new VehicleDimms;
	//VehicleDimms *vd = new VehicleDimms;
	VehicleParamsEx *vp = new VehicleParamsEx;
	vector<CfgVariable*> vars;
	vars = *m_vehicleDimms->getVariableList();
	for(int i = 0; i < vp->getVariableList()->size(); i++)
	{
		vars.push_back((*vp->getVariableList())[i]);
	}
	Vec3 rotateFrontLeftWheel;
	Vec3 rotateFrontRightWheel;
	Vec3 rotateRearLeftWheel;
	Vec3 rotateRearRightWheel;

	Vec3 rotateChassis;
	string paramsType;
	string wheelFrontLeftModel;
	string wheelFrontRightModel;
	string wheelRearLeftModel;
	string wheelRearRightModel;
	string chassisModel;

	vars.push_back(new CfgVariable(V_VEC3, &rotateFrontLeftWheel, getVarName(rotateFrontLeftWheel)));
	vars.push_back(new CfgVariable(V_VEC3, &rotateFrontRightWheel, getVarName(rotateFrontRightWheel)));
	vars.push_back(new CfgVariable(V_VEC3, &rotateRearLeftWheel, getVarName(rotateRearLeftWheel)));
	vars.push_back(new CfgVariable(V_VEC3, &rotateRearRightWheel, getVarName(rotateRearRightWheel)));
	vars.push_back(new CfgVariable(V_VEC3, &rotateChassis, getVarName(rotateChassis)));

	vars.push_back(new CfgVariable(V_STRING, &paramsType, getVarName(paramsType)));

	vars.push_back(new CfgVariable(V_STRING, &wheelFrontLeftModel, getVarName(wheelFrontLeftModel)));
	vars.push_back(new CfgVariable(V_STRING, &wheelFrontRightModel, getVarName(wheelFrontRightModel)));
	vars.push_back(new CfgVariable(V_STRING, &wheelRearLeftModel, getVarName(wheelRearLeftModel)));
	vars.push_back(new CfgVariable(V_STRING, &wheelRearRightModel, getVarName(wheelRearRightModel)));
	vars.push_back(new CfgVariable(V_STRING, &chassisModel, getVarName(chassisModel)));

	CfgLoader cfg(fname, &vars);

	D3DXMatrixRotationYawPitchRoll(&m_vehicleDimms->matFrontLeftWheelRotation, rotateFrontLeftWheel.y, rotateFrontLeftWheel.x, rotateFrontLeftWheel.z);
	D3DXMatrixRotationYawPitchRoll(&m_vehicleDimms->matFrontRightWheelRotation, rotateFrontRightWheel.y, rotateFrontRightWheel.x, rotateFrontRightWheel.z);
	D3DXMatrixRotationYawPitchRoll(&m_vehicleDimms->matRearLeftWheelRotation, rotateRearLeftWheel.y, rotateRearLeftWheel.x, rotateRearLeftWheel.z);
	D3DXMatrixRotationYawPitchRoll(&m_vehicleDimms->matRearRightWheelRotation, rotateRearRightWheel.y, rotateRearRightWheel.x, rotateRearRightWheel.z);


	D3DXMatrixRotationYawPitchRoll(&m_vehicleDimms->matChassisRotation, rotateChassis.y, rotateChassis.x, rotateChassis.z);

	m_objChassis = new RendObj(chassisModel, new Material("wood.jpg", "", ""), Vec3(0, 0, 0));
	m_objFrontLeftWheel = new RendObj(wheelFrontLeftModel, new Material("wood.jpg", "", ""), Vec3(0, 0, 0));
	m_objFrontRightWheel = new RendObj(wheelFrontRightModel, new Material("wood.jpg", "", ""), Vec3(0, 0, 0));
	m_objRearLeftWheel = new RendObj(wheelRearLeftModel, new Material("wood.jpg", "", ""), Vec3(0, 0, 0));
	m_objRearRightWheel = new RendObj(wheelRearRightModel, new Material("wood.jpg", "", ""), Vec3(0, 0, 0));

	core.game->getWorld()->addToWorld(m_objChassis, NO_COLLISION, 0, GROUP_NON_COLLIDABLE);
	core.game->getWorld()->addToWorld(m_objFrontLeftWheel, NO_COLLISION, 0, GROUP_NON_COLLIDABLE);
	core.game->getWorld()->addToWorld(m_objFrontRightWheel, NO_COLLISION, 0, GROUP_NON_COLLIDABLE);
	core.game->getWorld()->addToWorld(m_objRearLeftWheel, NO_COLLISION, 0, GROUP_NON_COLLIDABLE);
	core.game->getWorld()->addToWorld(m_objRearRightWheel, NO_COLLISION, 0, GROUP_NON_COLLIDABLE);

	m_vehicleDimms->chassisDimm = Vec3(m_objChassis->getPose()->boundingBox.getWidth()/2, m_objChassis->getPose()->boundingBox.getHeight()/6, m_objChassis->getPose()->boundingBox.getDepth()/2);

	stopMotorAndBreak();

	m_jointPoint = m_vehicleDimms->jointPoint;
	m_joinedTrailer = NULL;
	m_joint = NULL;

	m_oldPos = Vec3(0, 0, 0);
	m_forward = Vec3(1, 0, 0);
	m_poseGiven = false;
	m_scene = dyn->getScene();
	m_setCurrentSteerAngle = false;
	m_setCurrentMotorTorque = false;
	m_setCurrentBrakeTorque = false;
	m_currentSteerAngle = 0;
	m_currentMotorTorque = 0;
	m_currentBrakeTorque = 0;
	m_vehiclePose = new VehiclePose;

	m_joint = NULL;
	m_joinedTrailer = NULL;

	D3DXMatrixIdentity(&m_vehiclePose->matChassis);
	D3DXMatrixIdentity(&m_vehiclePose->matFrontLeftWheel);
	D3DXMatrixIdentity(&m_vehiclePose->matFrontRightWheel);
	D3DXMatrixIdentity(&m_vehiclePose->matRearLeftWheel);
	D3DXMatrixIdentity(&m_vehiclePose->matRearRightWheel);

	//m_actor = dyn->createBox(pos + NxVec3(0,0.5,0), NxVec3(2,0.25,1), 10);
	m_actor = dyn->createBox(pos + NxVec3(0,0.5,0), NxVec3(m_vehicleDimms->chassisDimm), m_vehicleDimms->chassisDensity);
	SetActorCollisionGroup(m_actor, GROUP_COLLIDABLE_NON_PUSHABLE);
	//m_actor = dyn->createBox(pos + NxVec3(0,0.5,0), NxVec3(2,0.25,1), dimm->chassisDensity);

// Wheel material globals
	NxMaterial* wsm = NULL;

	NxTireFunctionDesc lngTFD;
	lngTFD.extremumSlip = 1.0f;
	lngTFD.extremumValue = 0.02f;
	lngTFD.asymptoteSlip = 2.0f;
	lngTFD.asymptoteValue = 0.01f;	
	lngTFD.stiffnessFactor = 1000000.0f;

	NxTireFunctionDesc latTFD;
	latTFD.extremumSlip = 1.0f;
	latTFD.extremumValue = 0.02f;
	latTFD.asymptoteSlip = 2.0f;
	latTFD.asymptoteValue = 0.01f;	
	latTFD.stiffnessFactor = 1000000.0f;

	NxTireFunctionDesc slipTFD;
	slipTFD.extremumSlip = 1.0f;
	slipTFD.extremumValue = 0.02f;
	slipTFD.asymptoteSlip = 2.0f;
	slipTFD.asymptoteValue = 0.01f;	
	slipTFD.stiffnessFactor = 100.0f;  

	NxTireFunctionDesc medTFD;
	medTFD.extremumSlip = 1.0f;
	medTFD.extremumValue = 0.02f;
	medTFD.asymptoteSlip = 2.0f;
	medTFD.asymptoteValue = 0.01f;	
	medTFD.stiffnessFactor = 10000.0f;

	// Front left wheel
	NxWheelDesc wheelDesc;
	wheelDesc.frictionToFront = 100.0f;
	wheelDesc.frictionToSide = 1.0f;


	wheelDesc.wheelApproximation = 0;
	wheelDesc.wheelRadius = m_vehicleDimms->frontWheelsRadius;
	wheelDesc.wheelWidth = m_vehicleDimms->frontWheelsWidth;  // 0.1
	wheelDesc.wheelSuspension = 10;  
	wheelDesc.springRestitution = 0.1;
	wheelDesc.springDamping = 10;
	wheelDesc.springBias = 10;  
	wheelDesc.maxBrakeForce = 0.01;
	wheelDesc.position = NxVec3(m_vehicleDimms->posFrontLeftWheel);
	wheelDesc.wheelFlags = NX_WF_USE_WHEELSHAPE | NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
						   NX_WF_AFFECTED_BY_HANDBRAKE | NX_WF_STEERABLE_INPUT;

	// Front right wheel
	NxWheelDesc wheelDesc2;
	wheelDesc2.frictionToFront = 100.0f;
	wheelDesc2.frictionToSide = 1.0f;



	wheelDesc2.wheelApproximation = 0;
	wheelDesc2.wheelRadius = m_vehicleDimms->frontWheelsRadius;
	wheelDesc2.wheelWidth = m_vehicleDimms->frontWheelsWidth;  // 0.1
	wheelDesc2.wheelSuspension = 10;  
	wheelDesc2.springRestitution = 0.1;
	wheelDesc2.springDamping = 10;
	wheelDesc2.springBias = 10;  
	wheelDesc.maxBrakeForce = 0.01;
	wheelDesc2.position = NxVec3(m_vehicleDimms->posFrontRightWheel);
	wheelDesc2.wheelFlags = NX_WF_USE_WHEELSHAPE | NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
							NX_WF_AFFECTED_BY_HANDBRAKE | NX_WF_STEERABLE_INPUT;

	// Rear left wheel
	NxWheelDesc wheelDesc3;
	wheelDesc3.frictionToFront = 100.0f;
	wheelDesc3.frictionToSide = 1.0f;



	wheelDesc3.wheelApproximation = 0;
	wheelDesc3.wheelRadius = m_vehicleDimms->rearWheelsRadius;
	wheelDesc3.wheelWidth = m_vehicleDimms->rearWheelsWidth;  // 0.1
	wheelDesc3.wheelSuspension = 10;  
	wheelDesc3.springRestitution = 0.1;
	wheelDesc3.springDamping = 10;
	wheelDesc3.springBias = 10;  
	wheelDesc3.maxBrakeForce = 0.01;
	wheelDesc3.position = NxVec3(m_vehicleDimms->posRearLeftWheel);
	wheelDesc3.wheelFlags = NX_WF_USE_WHEELSHAPE | NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
							NX_WF_AFFECTED_BY_HANDBRAKE | NX_WF_STEERABLE_INPUT;

	// Rear right wheel
	NxWheelDesc wheelDesc4;
	wheelDesc4.frictionToFront = 100.0f;
	wheelDesc4.frictionToSide = 1.0f;


	wheelDesc4.wheelApproximation = 0;
	wheelDesc4.wheelRadius = m_vehicleDimms->rearWheelsRadius;
	wheelDesc4.wheelWidth = m_vehicleDimms->rearWheelsWidth;  // 0.1
	wheelDesc4.wheelSuspension = 10;  
	wheelDesc4.springRestitution = 0.1;
	wheelDesc4.springDamping = 10;
	wheelDesc4.springBias = 10;  
	wheelDesc4.maxBrakeForce = 0.01;
	wheelDesc4.position = NxVec3(m_vehicleDimms->posRearRightWheel);
	wheelDesc4.wheelFlags = NX_WF_USE_WHEELSHAPE | NX_WF_BUILD_LOWER_HALF | NX_WF_ACCELERATED | 
							NX_WF_AFFECTED_BY_HANDBRAKE | NX_WF_STEERABLE_INPUT;


	wheelDesc4.frictionToFront = wheelDesc3.frictionToFront = wheelDesc2.frictionToFront = wheelDesc.frictionToFront = 100.0f;
	wheelDesc4.frictionToSide = wheelDesc3.frictionToSide = wheelDesc2.frictionToSide = wheelDesc.frictionToSide = 1.0f;


	/*wheelDesc4.wheelSuspension = wheelDesc3.wheelSuspension = wheelDesc2.wheelSuspension = wheelDesc.wheelSuspension = 0.0001;
	wheelDesc4.springRestitution = wheelDesc3.springRestitution = wheelDesc2.springRestitution = wheelDesc.springRestitution = 0.0001;
	wheelDesc4.springDamping = wheelDesc3.springDamping = wheelDesc2.springDamping = wheelDesc.springDamping = 0.001;
	wheelDesc4.springBias = wheelDesc3.springBias = wheelDesc2.springBias = wheelDesc.springBias = 0.001;
	wheelDesc4.maxBrakeForce = wheelDesc3.maxBrakeForce = wheelDesc2.maxBrakeForce = wheelDesc.maxBrakeForce = 0.01;*/

	if(paramsType != "Extended")
	{
		wheelDesc4.wheelSuspension = wheelDesc3.wheelSuspension = wheelDesc2.wheelSuspension = wheelDesc.wheelSuspension = 0.5f / 10;
		wheelDesc4.springRestitution = wheelDesc3.springRestitution = wheelDesc2.springRestitution = wheelDesc.springRestitution = 1000.0f / 100000000000;
		wheelDesc4.springDamping = wheelDesc3.springDamping = wheelDesc2.springDamping = wheelDesc.springDamping = 0.5f / 10000000000000;
		wheelDesc4.springBias = wheelDesc3.springBias = wheelDesc2.springBias = wheelDesc.springBias = 1.0f / 10000000000000;
		wheelDesc4.maxBrakeForce = wheelDesc3.maxBrakeForce = wheelDesc2.maxBrakeForce = wheelDesc.maxBrakeForce = 0.01f; // 100;
	}
	else
	{
		wheelDesc4.frictionToFront = wheelDesc3.frictionToFront = wheelDesc2.frictionToFront = wheelDesc.frictionToFront = vp->frictionToFront;
		wheelDesc4.frictionToSide = wheelDesc3.frictionToSide = wheelDesc2.frictionToSide = wheelDesc.frictionToSide = vp->frictionToSide;

		wheelDesc4.wheelSuspension = wheelDesc3.wheelSuspension = wheelDesc2.wheelSuspension = wheelDesc.wheelSuspension = vp->wheelSuspension;
		wheelDesc4.springRestitution = wheelDesc3.springRestitution = wheelDesc2.springRestitution = wheelDesc.springRestitution = vp->springRestitution;
		wheelDesc4.springDamping = wheelDesc3.springDamping = wheelDesc2.springDamping = wheelDesc.springDamping = vp->springDamping;
		wheelDesc4.springBias = wheelDesc3.springBias = wheelDesc2.springBias = wheelDesc.springBias = vp->springBias;
		wheelDesc4.maxBrakeForce = wheelDesc3.maxBrakeForce = wheelDesc2.maxBrakeForce = wheelDesc.maxBrakeForce = vp->maxBrakeForce; // 100;
	}

	m_wheelFrontLeft = AddWheelToActor(m_actor, &wheelDesc);
	m_wheelFrontRight = AddWheelToActor(m_actor, &wheelDesc2);
	m_wheelRearLeft = AddWheelToActor(m_actor, &wheelDesc3);
	m_wheelRearRight = AddWheelToActor(m_actor, &wheelDesc4);

	m_wheelFrontLeft->userData = (void*)new ShapeUserData;
	m_wheelFrontRight->userData = (void*)new ShapeUserData;
	m_wheelRearLeft->userData = (void*)new ShapeUserData;
	m_wheelRearRight->userData = (void*)new ShapeUserData;

	// LOWER THE CENTER OF MASS
	NxVec3 massPos = m_actor->getCMassLocalPosition();
	massPos.y -= 1;
	m_actor->setCMassOffsetLocalPosition(massPos);
	m_actor->wakeUp(1e30);
}