Game Development Community

TDN Tutorial: Flying Vehicle Help

by Toby W. Allen · in Torque Game Engine · 02/13/2006 (4:22 pm) · 3 replies

Hey all, I'm writting a tutorial for TDN - http://tdn.garagegames.com/wiki/DTS/3dsmax/Creating_a_Simple_Flying_Vehicle

I have the full model set out, as shown in the TDN tutorial I've started. What I can't figure out is why the contrails aren't working. I've tried to read as much as I can and all I can see is that you need the nodes (check), the particle system (check) and then make sure it's linked in the vehicle's datablock (check). It's just not doing anything.

Additionally, can someone confirm that the jetnozzle nodes need to be activated by the keyboard command.

I've got some code to get it mounting and unmounting but I can't get these to work yet, which doesn't worry me, what does it the whole nodes not working for the smoke, lights, contrails, etc.. I've checked the emitters, they work.

Any pointers?

#1
02/15/2006 (10:08 am)
You need a contrail speed in the vehicle data block.
I can't remember what the precise call is but you need a contrail start speed

umm i haven't gotten in to much else
but hopefully that helps
#2
02/15/2006 (6:03 pm)
Well I have that, which is what I don.t get - I got the nodes places 'Contrail0' and 'Contrail1' with the follow block:

datablock FlyingVehicleData(TKFighter)
{
    spawnOffset               = "0 0 2";
    emap                      = true;
    category                  = "Vehicles";
    shapeFile                 = "~/data/shapes/vehicles/tkfighter.dts";
    multipassenger            = false;
    computeCRC                = true;
                	
    //debrisShapeName         = "~/data/shapes/vehicles/tkfighter_debris.dts";
    //debris                  = FighterShapeDebris;
    //renderWhenDestroyed     = false;

    drag                      = 0.50;
    density                   = 1.0;

// Mounting Details
    numMountPoints            = 10;
    maxMountSpeed             = 0.1;
    mountDelay                = 8;
    dismountDelay             = 1;
    stationaryThreshold       = 0.5;
    maxDismountSpeed          = 0.1;
    mountPose[0] = "Sitting";
    mountPointTransform[0]    = "0 0 0 0 0 1 0";
    isProtectedMountPoint[0]  = false;
    minMountDist			= 2;

// Camera Settings
    cameraOffset              = 1.5;  // Vertical offset from camera mount point
	cameraMaxDist           = 5;
	cameraOffset            = 1.5;
	cameraLag               = 0.1;
    cameraRoll                = true; // Roll the camera with the vehicle

// Explosions                 = FighterVehicleExplosion; // Particle Data?
    explosionDamage           = 10.5;
    explosionRadius           = 15.0;

    maxDamage                 = 50.40;
    destroyedLevel            = 50.40;

// Afterburner and any energy weapon pool        			
    energyPerDamagePoint      = 160;
    maxEnergy                 = 280;
    rechargeRate              = 0.8;

    minDrag                   = 40;           // Linear Drag (eventually slows you down when not thrusting...constant drag)
    rotationalDrag            = 20;        // Anguler Drag (dampens the drift after you stop moving the mouse...also tumble drag)

    maxAutoSpeed	            = 10;       // Autostabilizer kicks in when less than this speed. (meters/second)
    autoAngularForce          = 400;       // Angular stabilizer force (this force levels you out when autostabilizer kicks in)
    autoLinearForce           = 300;        // Linear stabilzer force (this slows you down when autostabilizer kicks in)
    autoInputDamping          = 0.55;      // Dampen control input so you don't' whack out at very slow speeds

// Maneuvering
    maxSteeringAngle          = 4;    // Max radiens you can rotate the wheel. Smaller number is more maneuverable.
    horizontalSurfaceForce    = 30;   // Horizontal center "wing" (provides "bite" into the wind for climbing/diving and turning)
    verticalSurfaceForce      = 20;     // Vertical center "wing" (controls side slip. lower numbers make MORE slide.)
    maneuveringForce          = 6400;      // Horizontal jets (W,S,D,A key thrust)
    steeringForce             = 1500;         // Steering jets (force applied when you move the mouse)
    steeringRollForce         = 200;      // Steering jets (how much you heel over when you turn)
    rollForce        		= 10;  // Auto-roll (self-correction to right you after you roll/invert)
    hoverHeight        		= 0.5;       // Height off the ground at rest
    createHoverHeight         = 0.5;  // Height off the ground when created
    maxForwardSpeed        	= 90;  // speed in which forward thrust force is no longer applied (meters/second)

// Turbo Jet
    jetForce        		= 3000;      // Afterburner thrust (this is in addition to normal thrust)
    minJetEnergy        	= 28;     // Afterburner can't be used if below this threshhold.
    jetEnergyDrain        	= 2.8;       // Energy use of the afterburners (low number is less drain...can be fractional)                                                                                                                                                                                                                                                                                          // Auto stabilize speed
    vertThrustMultiple        = 3.0;

// Rigid body
    mass                      = 100;        // Mass of the vehicle
    integration               = 3;           // Physics integration: TickSec/Rate
    collisionTol              = 0.6; // Collision distance tolerance
    contactTol                = 0.4; // Contact velocity tolerance

    bodyFriction              = 0;     // Don't mess with this.
    bodyRestitution           = 0.8;   // When you hit the ground, how much you rebound. (between 0 and 1)
    minRollSpeed              = 2000;     // Don't mess with this.
    softImpactSpeed        	= 3;       // Sound hooks. This is the soft hit.
    hardImpactSpeed        	= 15;    // Sound hooks. This is the hard hit.

// Ground Impact Damage (uses DamageType::Ground)
    minImpactSpeed        	= 10;      // If hit ground at speed above this then it's an impact. Meters/second
    speedDamageScale          = 0.06;

// Object Impact Damage (uses DamageType::Impact)
    collDamageThresholdVel    = 23.0;
    collDamageMultiplier      = 0.02;

// Contrails
    minTrailSpeed        	= 10;      // The speed your contrail shows up at.
    trailEmitter        	= FighterContrailEmitter;
    forwardJetEmitter         = FighterFJetEmitter;
    downJetEmitter        	= FighterDJetEmitter;

//Sounds
    jetSound        		= FighterThrustSound;
    engineSound        	      = FighterEngineSound;
    softImpactSound        	= FighterSoftImpactSound;
    hardImpactSound        	= FighterHardImpactSound;

    //softSplashSoundVelocity			= 10.0;
    //mediumSplashSoundVelocity		= 15.0;
    //hardSplashSoundVelocity			= 20.0;
    //exitSplashSoundVelocity			= 10.0;

    //exitingWater        	= FighterExitWaterMediumSound;
    //impactWaterEasy        	= FighterImpactWaterSoftSound;
    //impactWaterMedium       = FighterImpactWaterMediumSound;
    //impactWaterHard        	= FighterImpactWaterMediumSound;
    //waterWakeSound        	= FighterWakeMediumSplashSound;

  dustEmitter        	      = FighterLiftoffDustEmitter;

    triggerDustHeight         = 4.0;
    dustHeight        		= 1.0;

//  damageEmitter[0]          = LightDamageSmoke;
//  damageEmitter[1]          = HeavyDamageSmoke;
//  damageEmitter[2]          = MediumDamageSmoke;

    damageEmitterOffset[0]	= "0.0 -3.0 0.0 ";
    damageLevelTolerance[0]	= 0.3;
    damageLevelTolerance[1]	= 0.7;
    numDmgEmitterAreas        = 3;
        		
// Weapons and Ammo
    //max[RocketAmmo]        	= 1000;

    //splashEmitter[0]        = VehicleFoamDropletsEmitter;
    //splashEmitter[1]        = VehicleFoamEmitter;

    //shieldImpact        	= VehicleShieldImpact;

    //cmdCategory        	= "Tactical";
    //cmdIcon        		= CMDFlyingScoutIcon;
    //cmdMiniIconName        	= "commander/MiniIcons/com_scout_grey";
    //targetNameTag        	= 'Fighter';
    //targetTypeTag        	= 'FlyingVehicle';
    //sensorData        	= AWACPulseSensor;
    //sensorRadius        	= AWACPulseSensor.detectRadius;
    //sensorColor        	= "255 194 9";
                	
    checkRadius               = 5.5;
    observeParameters         = "0 0 1";
    shieldEffectScale         = "0.937 1.125 0.60";
};
#3
02/15/2006 (6:03 pm)
//------------------------
// Particle Emitters
//------------------------

//FighterShapeDebris
//FighterVehicleExplosion;

//FighterLiftoffDustEmitter;

//LightDamageSmoke;
//HeavyDamageSmoke;
//MediumDamageSmoke;

// Contrail
datablock ParticleData(FighterContrailParticle)
{
  dragCoefficient      = 1.5;
  gravityCoefficient   = 0;
  inheritedVelFactor   = 0.2;
  constantAcceleration = 0.0;
  lifetimeMS           = 300000;
  lifetimeVarianceMS   = 0;
  textureName          = "~/data/particles/trailParticle";
  colors[0]     = "0.6 0.6 0.6 0.5";
  colors[1]     = "0.2 0.2 0.2 0";
  sizes[0]      = 0.6;
  sizes[1]      = 5;
};

datablock ParticleEmitterData(FighterContrailEmitter)
{
  ejectionPeriodMS = 500;
  periodVarianceMS = 0;
  ejectionVelocity = 1;
  velocityVariance = 1.0;
  ejectionOffset   = 0.0;
  thetaMin         = 0;
  thetaMax         = 180;
  phiReferenceVel  = 0;
  phiVariance      = 360;
  overrideAdvances = false;
  particles = "FighterContrailParticle";
};

// forward
datablock ParticleData(FighterFJetParticle)
{
  dragCoefficient      = 1.5;
  gravityCoefficient   = 0;
  inheritedVelFactor   = 0.2;
  constantAcceleration = 0.0;
  lifetimeMS           = 3000;
  lifetimeVarianceMS   = 0;
  textureName          = "~/data/particles/forwardParticle";
  colors[0]     = "0.6 0.6 0.6 0.5";
  colors[1]     = "0.2 0.2 0.2 0";
  sizes[0]      = 0.6;
  sizes[1]      = 5;
};

datablock ParticleEmitterData(FighterFJetEmitter)
{
  ejectionPeriodMS = 50;
  periodVarianceMS = 0;
  ejectionVelocity = 1;
  velocityVariance = 1.0;
  ejectionOffset   = 0.0;
  thetaMin         = 0;
  thetaMax         = 180;
  phiReferenceVel  = 0;
  phiVariance      = 360;
  overrideAdvances = false;
  particles = "FighterFJetParticle";
};

// Backward
datablock ParticleData(FighterBackParticle)
{
  dragCoefficient      = 1.5;
  gravityCoefficient   = 0;
  inheritedVelFactor   = 0.2;
  constantAcceleration = 0.0;
  lifetimeMS           = 3000;
  lifetimeVarianceMS   = 0;
  textureName          = "~/data/particles/backwardParticle";
  colors[0]     = "0.6 0.6 0.6 0.5";
  colors[1]     = "0.2 0.2 0.2 0";
  sizes[0]      = 0.6;
  sizes[1]      = 5;
};

datablock ParticleEmitterData(FighterBackEmitter)
{
  ejectionPeriodMS = 50;
  periodVarianceMS = 0;
  ejectionVelocity = 1;
  velocityVariance = 1.0;
  ejectionOffset   = 0.0;
  thetaMin         = 0;
  thetaMax         = 180;
  phiReferenceVel  = 0;
  phiVariance      = 360;
  overrideAdvances = false;
  particles = "FighterBackParticle";
};

//Upwards
datablock ParticleData(FighterUJetParticle)
{
  dragCoefficient      = 1.5;
  gravityCoefficient   = 0;
  inheritedVelFactor   = 0.2;
  constantAcceleration = 0.0;
  lifetimeMS           = 3000;
  lifetimeVarianceMS   = 0;
  textureName          = "~/data/particles/upParticle";
  colors[0]     = "0.6 0.6 0.6 0.5";
  colors[1]     = "0.2 0.2 0.2 0";
  sizes[0]      = 0.6;
  sizes[1]      = 5;
};

datablock ParticleEmitterData(FighterUJetEmitter)
{
  ejectionPeriodMS = 50;
  periodVarianceMS = 0;
  ejectionVelocity = 1;
  velocityVariance = 1.0;
  ejectionOffset   = 0.0;
  thetaMin         = 0;
  thetaMax         = 180;
  phiReferenceVel  = 0;
  phiVariance      = 360;
  overrideAdvances = false;
  particles = "FighterUJetParticle";
};

//Downward
datablock ParticleData(FighterDJetParticle)
{
  dragCoefficient      = 1.5;
  gravityCoefficient   = 0;
  inheritedVelFactor   = 0.2;
  constantAcceleration = 0.0;
  lifetimeMS           = 3000;
  lifetimeVarianceMS   = 0;
  textureName          = "~/data/particles/downParticle";
  colors[0]     = "0.6 0.6 0.6 0.5";
  colors[1]     = "0.2 0.2 0.2 0";
  sizes[0]      = 0.6;
  sizes[1]      = 5;
};

datablock ParticleEmitterData(FighterDJetEmitter)
{
  ejectionPeriodMS = 50;
  periodVarianceMS = 0;
  ejectionVelocity = 1;
  velocityVariance = 1.0;
  ejectionOffset   = 0.0;
  thetaMin         = 0;
  thetaMax         = 180;
  phiReferenceVel  = 0;
  phiVariance      = 360;
  overrideAdvances = false;
  particles = "FighterDJetParticle";
};

//------------------------
// Particle Emitters - END
//------------------------