Jump to content
scotg

cars: front heavy settings?

Recommended Posts

One of my cars is faceplanting over hills and even the smallest of bumps. The effect is so bad it ends up on its back, like it's trying to tumble forward in-air. Being a buggy, part of its testing involves jumping from berms and off of cliffs to kind of gauge its balance, which is how I discovered this. It also hugs smaller bumps in the front while the rear wheels are really bouncy, even though all wheels inherit the front-left's suspension values.

The buggy was working fine until I did a series of minor tweaks for suspension adjustment. Since discovering the problem, I have worked backwards trying to restore it to its working state, only to keep seeing this problem. It's as if there's a tank-sized mass sitting on its front bumper. I have already looked into the model's geom LOD. Unless I need another look, the mass distribution and CoG is on point. So here's what I'm wondering: Are there any config settings that will affect this so dramatically, despite the geometry positioning?

Here's a list of some things that seem to have no affect on the nose-heavy action:
- terrainCoef

class Wheels:
- mass
- MOI
- dampingRate
- sprungMass
- springStrength
- springDamperRate
- latStiffX

- latStiffY

 

Pertinent Config Section (anything missing?):

Spoiler

class aweStriker_01_base_F: Car_F
    {
        mapSize = 6.18;
        author = "Scot Gilmore";
        _generalMacro = "aweStriker_01_base_F";
        displayName = "AWE Striker";
        class Library
        {
            libTextDesc = "All Weather Environment Striker";
        };
        model     = "aweStriker\aweStriker1";
        picture    = "aweStriker\Data\UI\icon_aweStriker_co.paa";
        Icon    = "aweStriker\Data\UI\map_aweStriker_co.paa";
        cost = 50000;
        slingLoadCargoMemoryPoints[] = {"SlingLoadCargo1","SlingLoadCargo2","SlingLoadCargo3","SlingLoadCargo4"};
        unitInfoType = "RscUnitInfoNoWeapon";
        class Turrets{};
        class HitPoints: HitPoints
        {
            class HitLFWheel: HitLFWheel
            {
                armor = 0.15;
            };
            class HitLF2Wheel: HitLF2Wheel
            {
                armor = 0.15;
            };
            class HitRFWheel: HitRFWheel
            {
                armor = 0.15;
            };
            class HitRF2Wheel: HitRF2Wheel
            {
                armor = 0.15;
            };
            class HitFuel
            {
                armor = 0.14;
                material = -1;
                name = "palivo";
                visual = "";
                passThrough = 1;
            };
            class HitEngine
            {
                armor = 0.5;
                material = -1;
                name = "engine";
                visual = "";
                passThrough = 1;
            };
            class HitGlass1: HitGlass1
            {
                armor = 1;
            };
            class HitGlass2: HitGlass2
            {
                armor = 1;
            };
            class HitGlass3: HitGlass3
            {
                armor = 1;
            };
            class HitGlass4: HitGlass4
            {
                armor = 1;
            };
            class HitGlass5: HitGlass5
            {
                armor = 1;
            };
            class HitGlass6: HitGlass6
            {
                armor = 0.5;
            };
        };
        transportSoldier = 1;
        class TransportItems
        {
            class _xx_FirstAidKit
            {
                name = "FirstAidKit";
                count = 4;
            };
        };
        driverAction = "awes_driver";
        cargoAction[] = {"awes_cargo"};
        armor = 5;
        fireResistance = 5;
        terrainCoef = 1;
        turnCoef = 2.8; //3.1;
        precision = 20;
        brakeDistance = 5;
        acceleration = 12;
        class AnimationSources: AnimationSources
        {
            class Hide
            {
                source = "user";
                animPeriod = 1;
                initPhase = 0;
            };
        };
        
        
        #include "sounds.hpp" //separate file for better work flow
        
        thrustDelay = 2.0;
        brakeIdleSpeed = 1.78;
        maxSpeed = 211;
        fuelCapacity = 45;
        wheelCircumference = 3.0;
        antiRollbarForceCoef = 2.0;//2
        antiRollbarForceLimit = 5;
        antiRollbarSpeedMin = 10;
        antiRollbarSpeedMax = 200;
        idleRpm = 800;
        redRpm = 6400;
        class complexGearbox
        {
            GearboxRatios[] = {"R1",-6.575,"N",0,"D1",4.827,"D2",2.855,"D3",1.716,"D4",1.073,"D5",0.755,"D6",0.575};
            TransmissionRatios[] = {"High",5.69};
            gearBoxMode = "auto";
            moveOffGear = 1;
            driveString = "D";
            neutralString = "N";
            reverseString = "R";
        };
        simulation = "carx";
        dampersBumpCoef = 0.3;
        differentialType = "rear_limited";
        frontRearSplit = 0.5;
        frontBias = 1.9;
        rearBias = 1.9;
        centreBias = 1.9;
        clutchStrength = 50.0;
        enginePower = 82;
        normalSpeedForwardCoef = 0.75;
        maxOmega = 437;
        peakTorque = 680;
        dampingRateFullThrottle = 0.1;
        dampingRateZeroThrottleClutchEngaged = 1.0;
        dampingRateZeroThrottleClutchDisengaged = 0.35;
        torqueCurve[] = {{0.0,0.0},{0.185,0.713},{0.35,1.0},{0.5,0.975},{0.75,0.755},{0.85,0.627},{1.0,0.415}};
        changeGearMinEffectivity[] = {0.95,0.15,0.65,0.65,0.65,0.55,0.55,0.55};
        switchTime = 0.21;
        latency = 0.25;
        class Wheels
        {
            class LF
            {
                boneName = "wheel_1_1_damper";
                steering = 1;
                side = "left";
                center = "wheel_1_1_axis";
                boundary = "wheel_1_1_bound";
                width = "0.2";
                mass = 20;
                MOI = 78.625;
                dampingRate = 0.5;
                maxBrakeTorque = 4000;
                maxHandBrakeTorque = 0;
                suspTravelDirection[] = {0,-1,0};
                suspForceAppPointOffset = "wheel_1_1_axis";
                tireForceAppPointOffset = "wheel_1_1_axis";
                maxCompression = 0.1;
                mMaxDroop = 0.1;
                sprungMass = 150;
                springStrength = 45000;
                springDamperRate = 5240;
                longitudinalStiffnessPerUnitGravity = 100000;
                latStiffX = 2.5;
                latStiffY = 180.0;
                frictionVsSlipGraph[] = {{0,1},{0.5,1},{1,1}};
            };
            class LR
            {
                boneName = "wheel_1_2_damper";
                steering = 0;
                side = "left";
                center = "wheel_1_2_axis";
                boundary = "wheel_1_2_bound";
                width = "0.2";
                mass = 20;
                MOI = 78.625;
                dampingRate = 0.5;
                maxBrakeTorque = 4000;
                maxHandBrakeTorque = 0;
                suspTravelDirection[] = {0,-1,0};
                suspForceAppPointOffset = "wheel_1_2_axis";
                tireForceAppPointOffset = "wheel_1_2_axis";
                maxCompression = 0.2;
                mMaxDroop = 0.1;
                sprungMass = 150;
                springStrength = 45000;
                springDamperRate = 5240;
                longitudinalStiffnessPerUnitGravity = 100000;
                latStiffX = 2.5;
                latStiffY = 180.0;
                frictionVsSlipGraph[] = {{0,1},{0.5,1},{1,1}};
            };
            class RF: LF
            {
                boneName = "wheel_2_1_damper";
                side = "right";
                center = "wheel_2_1_axis";
                boundary = "wheel_2_1_bound";
                suspForceAppPointOffset = "wheel_2_1_axis";
                tireForceAppPointOffset = "wheel_2_1_axis";
            };
            class RR: LR
            {
                boneName = "wheel_2_2_damper";
                side = "right";
                center = "wheel_2_2_axis";
                boundary = "wheel_2_2_bound";
                suspForceAppPointOffset = "wheel_2_2_axis";
                tireForceAppPointOffset = "wheel_2_2_axis";
            };
        };
         class PlayerSteeringCoefficients /// steering sensitivity configuration
        {
            turnIncreaseConst  = 0.3; // basic sensitivity value, higher value = faster steering
            turnIncreaseLinear = 1.0; // higher value means less sensitive steering in higher speed, more sensitive in lower speeds
            turnIncreaseTime   = 1.0; // higher value means smoother steering around the center and more sensitive when the actual steering angle gets closer to the max. steering angle
             
            turnDecreaseConst  = 5.0; // basic caster effect value, higher value = the faster the wheels align in the direction of travel
            turnDecreaseLinear = 3.0; // higher value means faster wheel re-centering in higher speed, slower in lower speeds
            turnDecreaseTime   = 0.0; // higher value means stronger caster effect at the max. steering angle and weaker once the wheels are closer to centered position
             
            maxTurnHundred     = 0.7; // coefficient of the maximum turning angle @ 100km/h; limit goes linearly to the default max. turn. angle @ 0km/h
        };
    };
   


It should be noted that this is a 650 kg RWD, Rear engine buggy. If there should be any imbalance, it should be back-heavy. Strangely, whenever I shift the Geom LOD weights toward the rear in OB and recompile, the result is the rear suspension is compressed all the way, and it still nose dives off of cliffs -- another reason I think there might be some config setting that defeats the weight distribution. PLEASE HELP?!?!?!

Share this post


Link to post
Share on other sites

Adjusting the physx to get it right does take time, as so many factors are interlinked, both in the config and the p3d. Anyone of them can severely mess things up.

 

This might help for starters - change these values in all 4 wheels:

 

sprungMass = 163;                 // 650kg / 4 --- all of the mass of the vehicle must be supported by the suspension
springStrength = 4075;           // start at 25 x sprungMass
springDamperRate = 1630;    // 2 x sqrt(springStrength x sprungMass)

 

You might want to look at lowering the MOI to somewhere between 10 and 40 (and probably in the lower end of that range).

Check that your centre of mass in the Geometry LOD is above a line joining the top of the suspension movement (so simplistically, c of m above the tops of the wheels). It doesn't like being below it.

Run the Arma development branch, and use the diagnostic exe, then you can toggle on PhysX debug to look in detail at the suspension and other engine parameters as it moves in game.

  • Like 1

Share this post


Link to post
Share on other sites
6 hours ago, UK_Apollo said:

Check that your centre of mass in the Geometry LOD is above a line joining the top of the suspension movement (so simplistically, c of m above the tops of the wheels). It doesn't like being below it.

Is there any impact CoM position in relation to the world axis/origin (0,0,0)? I.E.: Should the CoM be there?

Share this post


Link to post
Share on other sites
2 hours ago, scotg said:

Is there any impact CoM position in relation to the world axis/origin (0,0,0)? I.E.: Should the CoM be there?

No.

I usually build vehicles with the base of the wheels sitting on the [0,0] plane, but that's just preference.

Use the LandContact LOD points (give them the damper named selection) and the wheel boundary memory points to sit the car flush on the ground.

Make sure the CoM is centred (from side to side) and I recommend also centred from front to back. If you position the CoM off-centre (perhaps towards the rear, because you said it's rear engined), you may need to adjust the wheel sprung mass and spring strengths to keep it level.

 

  • Like 1

Share this post


Link to post
Share on other sites

Just for eliminating all possibilities, I've re-centered the CoM to the F/B; it was already L/R centered. I've yet to check it out in Dev Branch mode. Are there any forewarnings for that, like will I be able to revert back?

Share this post


Link to post
Share on other sites

Yes, you can revert back. Last time I did it, it was something like a 9GB download to switch one way or the other, and of course dev branch gets updated almost daily. So if you have unlimited fast internet, it's no problem.

 

Here's the info for the diagnostics .exe: https://community.bistudio.com/wiki/Arma_3_Diagnostics_Exe

Relevant to you will be 'EPEVehicle' and 'EPEForce'.

  • Like 1

Share this post


Link to post
Share on other sites
4 hours ago, Redphoenix said:

Show a side view of your geometry LOD.

I've tried all sorts of weight distribution combinations. This is the current set up with each wheel as 20kg. The little decimeter cube in the back helps me move the weight around and try different distribution. I have tried using four cubes containing most of the weight (using the same principle of moving them around for balance shifting), while the main geometry weighed 5 kg total (as per the BIS examples).


Side View Geom LOD

 

Share this post


Link to post
Share on other sites

You don't have any "Componentnn" named selections.

Structure > Topology > Find Components

Share this post


Link to post
Share on other sites
4 minutes ago, UK_Apollo said:

You don't have any "Componentnn" named selections.

Structure > Topology > Find Components

LOL. True, but that's not the issue. I re-component convex hull whenever I reassign weights - habit. I just forgot to re-CCH for the picture.

Share this post


Link to post
Share on other sites

I can take a deeper look into it, but I would need the source files to compile and test it locally. Shoot me a PM if you like.

  • Like 1

Share this post


Link to post
Share on other sites

I think I might be on to something now... possibly. The game is not looking at the new config, or something. First, I tried renaming the vehicle in the displayName value. In the garage, it kept coming up as the old name. Next, I tried just deleting the PBO completely, but the name STILL appeared in the virtual garage. However, selecting the vehicle immediately puts me in "try it" mode, without a buggy, and without actually hitting the try it button.

Whenever I have made a change to the model itself, there has been a notable difference in game. That, combined with the name still in the game when the PBO is gone, leads me to believe the compile process is probably working.

BTW, when I was done with the garage, I pressed escape, then ctrl+F4 to quit. Usually it just quits, but this time it gave me the warning message about "ArmA 3 unexpectedly stopped." Something wrong with my game?

Share this post


Link to post
Share on other sites

Update 

Some of my config file updates are not being recognised by ARMA3, including the buggy. I copied all the buggy's files and components and created a "new" vehicle folder by simply changing every instance of "striker" to "shocker" inside and out. The new buggy was not visible in the virtual garage, but I could load it in the editor and test it in a mission. Although not even close to perfect, there was a noticeable improvement from the original buggy. These are the exact same build, except with different names. 

 

Next I tried to adjust the new buggy, but ran into the same problem as the old one - the update is not taking hold. I opened the PBO in eliteness and found it was indeed compiled anew. I then made a simple displayName change to another car, the LM002 to The BULL, and it was not recognised in game. I did tbe same to my Sky Hawk VTOL, renaming it Seahawk, and it took! 

 

So either the game doesn't like car mods, doesn't like MY car mods, or most likely all my cars have inherited some bad joujou. Or maybe it loves NFL :-D. At least I can identify the problem. 

Share this post


Link to post
Share on other sites

It sounds like you have an old pbo being loaded from a location that you don't expect and they're conflicting.

 

Launch Arma without loading your buggy pbo, go to your rpt file and look at the pbo list that is being loaded.

 

  • Like 1

Share this post


Link to post
Share on other sites

Yup. It turned out I had saved a PBO to an old location, but it was accessed sooner in the hierarchy. Since then, the updated PBOs I've been trying to get working were being bypassed (and to think of all the missed results!), except for the model information. See, but that's the part that was throwing me off.

This all sucks, because I had set aside some time to do more art work on my models. Researching and fixing this ate up most of that time, and aside from its two improved crew poses I made, I'm practically right where I stood before this mess. What really stings is how simple the problem was to fix once I discovered it. At least I can move forward now, and I got some good advice from you guys! Thanks for all the help UK_Apollo and RedPhoenix!!

Share this post


Link to post
Share on other sites

Good news! After finally getting to the bottom of the problem, and with thanks to UK_Apollo and RedPhoenix for their tips and support, the AWE Striker buggy is driving and performing even better than before. I've been recording it in motion hopping around the hills of Stratis, Altis, and Tanoa, and will hopefully have a video of it on YouTube soon. I've also sorted out the problem with the Crew poses, mostly.

EDIT: Here's the video!

 

  • Like 1

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

×