Jump to content
TroyT

Custom Hand Animation Issues

Recommended Posts

I've been trying to sort out custom hand animations but keep getting the weird, distorted hand positions.  I've found many threads concerning this but most of them are almost 10 years old.  I've run through most of the fixes in these threads but can't seem to crack it.  This video seemed promising but didn't do it - making a custom handanim for arma weapons

 

My current workflow is this:   

 

in Object Builder, open a fresh copy of BISkeleton.p3d from the BIS Oxygen 2 Examples http://www.armaholic.com/page.php?id=1903&highlight=BIMODELS I've also tried some of the RTM files in the Arma 3 Samples' "animation" folder.

Create keyframes -0.5000 and 0.0000

While in KF 0.0000, copy a version of my weapon model into the BISkeleton.p3d with all vertices included in a single named selection - "weapon".  I've also tried using a proxy.  

Manipulate hands as needed to fit my model making sure to enable "Points > Transform 3d > Show Local Axis" and using appropriate constraints while moving the skeleton

Delete my model - I've tried variations like leaving my model and deleting the M4 that comes with the p3d, leaving them both in, renaming the M4 named selection and keeping the one imported with my model, etc.

Export Matrices to my custom rtm file in my "addon/data/anim" folder.

 

I've copied the A3 Samples' Test_Weapon model.cfg into my addon folder and made a few adjustments to overcome some errors the PBO Project throws.

Run PBO Project and launch the game to test.

Repeat 1000 more times with various tweaks with an exasperated and exhausted plea for success that I fear will never come.

 

Any help would be appreciated.

 

Arma3_Hand_Anim_Craziness.jpg

 

My model.cfg:

Spoiler

class CfgSkeletons
{
    class Weapon
    {
        pivotsModel="";
        isDiscrete = 0;
        skeletonInherit = "";
        skeletonBones[] = {};
    };
    
    class Rifle: Weapon
    {
        pivotsModel="";
        isDiscrete = 0;
        skeletonInherit = "";
        skeletonBones[] = {};
    };

    class BSF_AA12_A1: Rifle
    {
        pivotsModel="";
        isDiscrete = 0;
        skeletonInherit = "";
        skeletonBones[] =
        {
            "trigger",        "", /// not in this model, but good to use
            "bolt",            "",
            "bolt_catch",    "",
            "magazine",        "",
            "safety",        "",
            "muzzleFlash",    "",
            "OP",            "",
            "ForeSight",    "",
            "BackSight",    ""
        };
    };
    class Test_Bipod
    {
        pivotsModel="";
        isDiscrete = 0;
        skeletonInherit = "";
        skeletonBones[] =
        {
            "bipod_legs",        "",
            "bipod_leg_L",        "bipod_legs",
                "leg_L",        "bipod_leg_L",
            "bipod_leg_R",        "bipod_legs",
                "leg_R",        "bipod_leg_R"
        };
    };    
    
    class Head
        {
        isDiscrete = 0;
        skeletonInherit = "";
        skeletonBones[] =
            {
                "neck","",
                "neck1","neck",
                "head","neck1",
                "lBrow","head",
                "mBrow","head",
                "rBrow","head",
                "lMouth","head",
                "mMouth","head",
                "rMouth","head",
                "eyelids","head",
                "LLip","head"
            };
        };

class OFP2_ManSkeleton {
        isDiscrete = 0;
        skeletonInherit = "Head";
        skeletonBones[] =
            {
                "weapon","",
                "launcher","",
                "Camera","",
                "Spine","",
                "Spine1","",
                "Spine2","",
                "Spine3","",
                "Pelvis","",
                "LeftShoulder","",
                "LeftArm","",
                "LeftArmRoll","",
                "LeftForeArm","",
                "LeftForeArmRoll","",
                "LeftHand","",
                "LeftHandRing","",
                "LeftHandRing1","",
                "LeftHandRing2","",
                "LeftHandRing3","",
                "LeftHandPinky1","",
                "LeftHandPinky2","",
                "LeftHandPinky3","",
                "LeftHandMiddle1","",
                "LeftHandMiddle2","",
                "LeftHandMiddle3","",
                "LeftHandIndex1","",
                "LeftHandIndex2","",
                "LeftHandIndex3","",
                "LeftHandThumb1","",
                "LeftHandThumb2","",
                "LeftHandThumb3","",
                "RightShoulder","",
                "RightArm","",
                "RightArmRoll","",
                "RightForeArm","",
                "RightForeArmRoll","",
                "RightHand","",
                "RightHandRing","",
                "RightHandRing1","",
                "RightHandRing2","",
                "RightHandRing3","",
                "RightHandPinky1","",
                "RightHandPinky2","",
                "RightHandPinky3","",
                "RightHandMiddle1","",
                "RightHandMiddle2","",
                "RightHandMiddle3","",
                "RightHandIndex1","",
                "RightHandIndex2","",
                "RightHandIndex3","",
                "RightHandThumb1","",
                "RightHandThumb2","",
                "RightHandThumb3","",
                "LeftUpLeg","",
                "LeftUpLegRoll","",
                "LeftLeg","",
                "LeftLegRoll","",
                "LeftFoot","",
                "LeftToeBase","",
                "RightUpLeg","",
                "RightUpLegRoll","",
                "RightLeg","",
                "RightLegRoll","",
                "RightFoot","",
                "RightToeBase",""
            };
        };    
    
    
};
class CfgModels
{
    class Default
    {
        sectionsInherit="";
        sections[] = {};
        skeletonName = "";
    };
    class Optic: Default
    {
        sections[]=
        {
            "zasleh"
        };
    };
    class Weapon: Default
    {
        sections[]=
        {
            "zasleh"
        };

        htMin = 1;        // Minimum half-cooling time (in seconds)
        htMax = 600;    // Maximum half-cooling time (in seconds)
        afMax = 0;        // Maximum temperature in case the model is alive (in celsius)
        mfMax = 0;        // 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 = 100;     // Metabolism temperature of the model (in celsius)

        skeletonName="Weapon";
        class Animations
        {
            class zaslehROT
            {
                type="rotation";
                source="clockMinute";
                sourceAddress="loop";
                selection="zasleh";
                begin="usti hlavne";
                end="konec hlavne";
                memory=1;
                minValue=0.0166665;
                maxValue=0.016666666666666666666666666666667;
                angle0="rad 0";
                angle1="rad 360";
            };
            class magazine_hide
            {
                type="hide";
                source="reloadMagazine";
                sourceAddress="mirror";
                selection="magazine";
                minValue=0.0;
                maxValue=0.4;
                hideValue=0.5;
            };
            class reload_ammobelt_hide: magazine_hide
            {
                selection="ammo_belt";
            };
            class reload_ammobelt_bottom_hide: magazine_hide
            {
                selection="ammo_belt_bottom";
            };
            class ammobelt_hide: magazine_hide
            {
                source="isEmpty";
                selection="ammo_belt";
                minValue=0.000000;
                maxValue=1.000000;
                hideValue=1.000000;
            };
            class ammobelt_bottom_hide: ammobelt_hide
            {
                selection="ammo_belt_bottom";
            };
            /// Hiding of magazine if weapon has none
            class no_magazine
            {
                type="hide";
                source="hasMagazine";
                selection="magazine";
                minValue=0.000000;
                maxValue=1.00000;
                hideValue=0.5;
                unhideValue = -1.0;
            };                
        };
    };
    class Rifle: Weapon
    {
        skeletonName="Rifle";
        class Animations: Animations
        {
            class magazine_hide:magazine_hide
            {
                sourceAddress="mirror";
                minValue=0.0;
                maxValue=0.56;
                hideValue=0.36;
            };
            class bolt_empty
            {
                type="translation";
                source="isEmpty";
                selection="bolt";
                axis="bolt_axis";
                memory=1;
                minValue=0.000000;
                maxValue=0.500000;
                offset0=0;
                offset1=0.5;
            };
            class bullet_cover
            {
                type="rotation";
                source="reload";
                sourceAddress="mirror";
                selection="bullet_cover";
                axis="bullet_cover_axis";
                memory=1;
                minValue=0.0;
                maxValue=0.5;
                angle0=0;
                angle1=-0.4;
            };
            class bolt_fire_begin
            {
                type="translation";
                source="reload";
                selection="bolt";
                axis="bolt_axis";
                memory=1;
                minValue=0.000000;
                maxValue=0.300000;
                offset0=0;
                offset1=0.5;
            };
            class bolt_fire_end:bolt_fire_begin
            {
                minValue=0.500000;
                maxValue=1.000000;
                offset0=0;
                offset1=-0.5;
            };
            class bolt_reload_begin
            {
                type="translation";
                source="reloadMagazine";
                selection="bolt";
                axis="bolt_axis";
                memory=1;
                minValue=0.1;
                maxValue=0.15;
                offset0=0;
                offset1=0.5;
            };
            class bolt_reload_end:bolt_reload_begin
            {
                minValue=0.980000;
                maxValue=1.000000;
                offset0=0;
                offset1=-0.5;
            };
        };
    };
    class BSF_AA12_A1_WeaponBase: Rifle
    {
        skeletonName = "BSF_AA12_A1";
        sectionsInherit = "";
        sections[] = {"muzzleFlash","Camo"};
        class Animations
        {
            class trigger /// not in this model, but good to use
            {
                type = "rotation";
                source = "reload";
                sourceAddress = "clamp";
                selection = "trigger";
                axis = "trigger_axis";
                minValue = 0;
                maxValue = "1";
                angle0 = "0";
                angle1 = "rad -30";
            };
            
            class bolt
            {
                type = "translation";
                source = "reload";
                sourceAddress = clamp;
                selection = "bolt";
                axis = "bolt_axis";
                minValue = 0.5;
                maxValue = 1;
                offset0 = 0;
                offset1 = 0.3;
            };
            class bolt_2: bolt
            {
                minValue = 0;
                maxValue = 0.5;
                offset0 = 0;
                offset1 = 0.7;
            };
            class bolt_empty: bolt{
                source = "isEmptyNoReload";
                minValue = 0;
                maxValue = 1;
                offset0 = 0;
                offset1 = 1;
            };
            class bolt_reload_move_1: bolt_empty {
                source="reloadMagazine";    // z: should work like that only if weapon is empty
                minValue=0;
                maxValue=0.00001;
            };
            class bolt_reload_move_2: bolt_reload_move_1 {
                source="reloadMagazine";    // z: should work like that only if weapon is empty
                minValue=0.78;
                maxValue=0.80;
                offset1 = -1;
            };
            class bolt_catch: bolt {
                selection = "bolt_catch";
                axis = "bolt_catch_axis";
            };
            class bolt_catch_2: bolt_2 {
                selection = "bolt_catch";
                axis = "bolt_catch_axis";
            };
            class bolt_catch_empty: bolt_empty {
                selection = "bolt_catch";
                axis = "bolt_catch_axis";
            };
            class bolt_catch_reload_move_1: bolt_reload_move_1 {
                selection = "bolt_catch";
                axis = "bolt_catch_axis";
            };
            class bolt_catch_reload_move_2: bolt_reload_move_2 {
                selection = "bolt_catch";
                axis = "bolt_catch_axis";
            };
            class magazine_hide
            {
                type="hide";
                source="reloadMagazine";
                selection="magazine";
                minValue=0.000000;
                maxValue=1.00000;
                hideValue=0.188;
                unhideValue = 0.550;
            };
            class no_magazine
            {
                type="hide";
                source="hasMagazine";
                selection="magazine";
                minValue=0.000000;
                maxValue=1.00000;
                hideValue=0.5;
                unhideValue = -1.0;
            };
            class magazine_reload_move_1
            {
                type = "translation";
                source = "reloadMagazine";
                selection = "magazine";
                axis = "magazine_axis";
                minValue = 0.145;
                maxValue = 0.170;
                offset0 = 0.0;
                offset1 = 0.5;
            };
            class magazine_reload_move_2: magazine_reload_move_1
            {
                minValue = 0.573;
                maxValue = 0.602;
                offset0 = 0.0;
                offset1 = -0.5;
            };

            class muzzleFlashROT
            {
                type="rotationX";
                source="ammoRandom";      //use ammo count as phase for animation
                sourceAddress="loop";     //loop when phase out of bounds
                selection="muzzleFlash";  //selection we want to rotate
                axis="";                  //no own axis - center of rotation is computed from selection
                centerFirstVertex=true;   //use first vertex of selection as center of rotation
                minValue=0;
                maxValue=4;               //rotation angle will be 360/4 = 90 degrees
                angle0="rad 0";
                angle1="rad 360";
            };
            class OP_ROT
            {
                type="rotation";
                source="zeroing2";    // use second muzzle zeroing for rotation
                sourceAddress="loop"; // loop when phase out of bounds
                selection="OP";       // selection we want to rotate
                axis="OP_axis";       // has its own axis
                minValue=0;
                maxValue=3;
                angle0="rad 0";
                angle1="rad 65";
            };
            class BackSight_optic
            {
                type="rotation";
                source="hasOptics";
                selection="BackSight";
                axis="BackSight_axis";
                memory=1;
                minValue=0.0000000;
                maxValue=1.0000000;
                angle0=0.000000;
                angle1=(rad 90);
            };
            class ForeSight_optic: BackSight_optic
            {
                selection="ForeSight";
                axis="ForeSight_axis";
                angle1=(rad 90);
            };

        // Rotation of fire mode switch
            class safety_mode_rot
            {
                type            = rotation;
                source            = weaponMode;
                selection        = "safety";
                axis            = "safety_axis";
                memory            = 1;
                minValue        = 0;
                maxValue        = 0.25;
                angle0            = 0;
                angle1            = (rad -52);
            };
        };
    };
    class BSF_AA12_A1: BSF_AA12_A1_WeaponBase {};
    
    class test_bipod_01_F
    {
        skeletonName    = "Test_Bipod";
        sectionsInherit = "";
        sections[]         = {"bipod_leg_L","bipod_leg_R","bipod_legs"};

        class Animations
        {
            class leg_L
            {
                type            = rotation;
                source            = bipod_legs;
                sourceAddress    = clamp;
                selection        = "bipod_leg_L";
                axis            = "bipod_leg_L_axis";
                minValue        = 0;
                maxValue        = 1;
                angle0            = (rad -5);
                angle1            = (rad 18);
            };

            class leg_R: leg_L
            {
                selection        = "bipod_leg_R";
                axis            = "bipod_leg_R_axis";
            };
            class legs: leg_L
            {
                selection        = "bipod_legs";
                axis            = "bipod_legs_axis";
                angle0            = (rad 0);
                angle1            = (rad 90);
            };
            class Leg_L_move
            {
                type            = translation;
                source            = bipod_legs_length;
                selection        = "Leg_L";
                axis            = "Leg_L_axis";
                memory            = 1;
                minValue        = 0;
                maxValue        = 1;
                offset0            = 0;
                offset1            = 10;
            };    
            class Leg_R_move: Leg_L_move
            {
                selection        = "Leg_R";
                axis            = "Leg_R_axis";
            };            
        };
    };    
};

 

my config.cpp

Spoiler

class cfgMods
{
    author="Troy - BS-Free";
    timepacked="1427022694";
};

class CfgPatches
{
    class BSF_AA12
    {
        author="Troy - BS-Free";
        requiredVersion= 1.60;
        requiredAddons[]={ "a3_weapons_f"};
        units[]={};
        weapons[]= {"BSF_AA12_1A_F"};
    };
};

/// All firemodes, to be sure
class Mode_SemiAuto;
class Mode_Burst;
class Mode_FullAuto;

/// Weapon slots
class SlotInfo;
class MuzzleSlot;
class CowsSlot;
class PointerSlot;
class UnderBarrelSlot;

#include "AA12_Ammo.hpp"

class CfgRecoils
{
    BSF_AA12_Recoil[]={0,0,0,0.039999999,0.079999998,0.039999999,0.039999999,0.039999999,0.02,0.039999999,0.02,0.0099999998,0.039999999,0.0099999998,0.0049999999,0.039999999,0.0049999999,0.0020000001,0.039999999,-0.0099999998,-0.0040000002,0.039999999,-0.0049999999,-0.02,0.039999999,0,0};
};

class CfgWeapons
{
    class Rifle;
    class Rifle_Base_F: Rifle
    {
        class WeaponSlotsInfo;
        class GunParticles;
    };

    class BSF_AA12_Base: Rifle_Base_F
    {
        magazines[]= {"BSF_12g_Drum_32Rnnd_Pellets","BSF_12g_Drum_32Rnnd_Slug"};
        reloadAction="GestureReloadM4SSAS";
        magazineReloadSwitchPhase = 0.4; /// part of reload animation when new magazine ammo count should affect "revolving" animation source
        discreteDistanceInitIndex = 0; /// Ironsight zeroing is the lowest value by default        
        maxRecoilSway=0.0125; // Size of recoil sway of the cursor
        swayDecaySpeed=1.25; // Speed at which the recoil sway goes back to zero (from maxRecoilSway to 0 in 1/swayDecaySpeed seconds)
        inertia = 0.5;/// inertia coefficient of the weapon
        
        /// positive value defines speed of the muzzle independent on the magazine setting, negative value is a coefficient of magazine initSpeed
        initSpeed = -1; /// this means that initSpeed of magazine is used
    
        class GunParticles : GunParticles
        {
            class SecondEffect
            {
                positionName = "Nabojnicestart";
                directionName = "Nabojniceend";
                effectName = "CaselessAmmoCloud";
            };
        };

/////////////////////////////////////////////////////  I R O N S I G H T S  /////////////////////////////////////////////////////
        opticsZoomMin=0.375;
        opticsZoomMax=1.1;
        opticsZoomInit=0.75;

        distanceZoomMin = 80;
        distanceZoomMax = 80;
/////////////////////////////////////////////////////  I R O N S I G H T S  /////////////////////////////////////////////////////

        descriptionShort="BSF AA12 1A";
        handAnim[]=
        {
            "OFP2_ManSkeleton",
            "BSF_Community_Addon\addons\BSF_AA12\data\anim\bsf_aa12.rtm"
        };

        dexterity=1.5;
    
        selectionFireAnim = "muzzleFlash"; /// are we able to get rid of all the zaslehs?
        
        modes[]= {"Single","FullAuto","fullauto_medium"};
        
        class Single: Mode_SemiAuto
        {
            sounds[]=
            {
                "StandardSound",
                "SilencedSound"
            };
            class BaseSoundModeType
            {
                weaponSoundEffect="DefaultRifle";
                closure1[]=
                {
                    "A3\sounds_f\weapons\closure\closure_rifle_7.wss",
                    1,
                    1,
                    200
                };
                closure2[]=
                {
                    "A3\sounds_f\weapons\closure\closure_rifle_6.wss",
                    1,
                    1,
                    200
                };
                soundClosure[]=
                {
                    "closure1",
                    0.5,
                    "closure2",
                    0.5
                };
            };
            class StandardSound: BaseSoundModeType
            {
                beginsound[]=
                {
                    "BSF_Community_Addon\addons\BSF_AA12\data\sounds\AA12.ogg",
                    1.5,
                    1,
                    900
                };
                soundBegin[]=
                {
                    "beginsound",
                    1
                };
            };
            class SilencedSound: BaseSoundModeType
            {
                beginsound[]=
                {
                    "BSF_Community_Addon\addons\BSF_AA12\data\sounds\AA12.ogg",
                    1.5,
                    1,
                    900
                };
                soundBegin[]=
                {
                    "beginsound",
                    1
                };
            };

            reloadTime=0.1;
            dispersion=0.001;

            recoil="BSF_AA12_Recoil";
            recoilProne="BSF_AA12_Recoil";

            minRange=2;        minRangeProbab=0.2;
            midRange=75;    midRangeProbab=0.34999999;
            maxRange=200;    maxRangeProbab=0.44999999;
        };        
        class FullAuto: Mode_FullAuto
        {
            sounds[] =
            {
                StandardSound,
                SilencedSound
            };
            class BaseSoundModeType
            {
                weaponSoundEffect="DefaultRifle";
                closure1[]=
                {
                    "A3\sounds_f\weapons\closure\closure_rifle_7.wss",
                    1,
                    1,
                    200
                };
                closure2[]=
                {
                    "A3\sounds_f\weapons\closure\closure_rifle_6.wss",
                    1,
                    1,
                    200
                };
                soundClosure[]=
                {
                    "closure1",
                    0.5,
                    "closure2",
                    0.5
                };
            };
            class StandardSound: BaseSoundModeType
            {
                beginsound[]=
                {
                    "BSF_Community_Addon\addons\BSF_AA12\data\sounds\AA12.ogg",
                    1.5,
                    1,
                    900
                };
                soundBegin[]=
                {
                    "beginsound",
                    1
                };
            };
            class SilencedSound: BaseSoundModeType
            {
                beginsound[]=
                {
                    "BSF_Community_Addon\addons\BSF_AA12\data\sounds\AA12.ogg",
                    1.5,
                    1,
                    900
                };
                soundBegin[]=
                {
                    "beginsound",
                    1
                };
            };

            reloadTime=0.1;
            dispersion=0.001;

            recoil="BSF_AA12_Recoil";
            recoilProne="BSF_AA12_Recoil";

            minRange=2;        minRangeProbab=0.2;
            midRange=75;    midRangeProbab=0.34999999;
            maxRange=200;    maxRangeProbab=0.44999999;

            aiRateOfFire = 0.000001;
        };
        class fullauto_medium: FullAuto /// Pew, pew, pew only for AI
        {
            showToPlayer = 0;
            burst = 3;

            minRange = 2; minRangeProbab = 0.5;
            midRange = 75; midRangeProbab = 0.7;
            maxRange = 150; maxRangeProbab = 0.05;

            aiRateOfFire = 2.0;
            aiRateOfFireDistance = 200;
        };

        aiDispersionCoefY=6.0; /// AI should have some degree of greater dispersion for initial shoots
        aiDispersionCoefX=4.0; /// AI should have some degree of greater dispersion for initial shoots
//        drySound[]={"A3\sounds_f\weapons\Other\dry_1", db-5, 1, 10}; /// custom made sounds
//        reloadMagazineSound[]={"A3\sounds_f\weapons\reloads\new_MX",db-8,1, 30}; /// custom made sounds
        drySound[]= {"A3\Sounds_F\weapons\Other\dry6.wss", 0.1, 1};
        reloadMagazineSound[]= {"BSF_Community_Addon\addons\BSF_AA12\data\sounds\reload.ogg", 1.3, 1, 30};

        bullet1[]={"A3\sounds_f\weapons\shells\5_56\metal_556_01.wss",0.1,1,15};
        bullet2[]={"A3\sounds_f\weapons\shells\5_56\metal_556_02.wss",0.1,1,15};
        bullet3[]={"A3\sounds_f\weapons\shells\5_56\metal_556_03.wss",0.17782794,1,15};
        bullet4[]={"A3\sounds_f\weapons\shells\5_56\metal_556_04.wss",0.17782794,1,15};
        bullet5[]={"A3\sounds_f\weapons\shells\5_56\asphlat_556_01.wss",0.1,1,15};
        bullet6[]={"A3\sounds_f\weapons\shells\5_56\asphlat_556_02.wss",0.1,1,15};
        bullet7[]={"A3\sounds_f\weapons\shells\5_56\asphlat_556_03.wss",0.1,1,15};
        bullet8[]={"A3\sounds_f\weapons\shells\5_56\asphlat_556_04.wss",0.1,1,15};
        bullet9[]={"A3\sounds_f\weapons\shells\5_56\grass_556_01.wss",0.0099999998,1,15};
        bullet10[]={"A3\sounds_f\weapons\shells\5_56\grass_556_02.wss",0.0099999998,1,15};
        bullet11[]={"A3\sounds_f\weapons\shells\5_56\grass_556_03.wss",0.0099999998,1,15};
        bullet12[]={"A3\sounds_f\weapons\shells\5_56\grass_556_04.wss",0.0099999998,1,15};

        soundBullet[]={"bullet1",0.082999997,"bullet2",0.082999997,"bullet3",0.082999997,"bullet4",0.082999997,"bullet5",0.082999997,"bullet6",0.082999997,"bullet7",0.082999997,"bullet8",0.082999997,"bullet9",0.082999997,"bullet10",0.082999997,"bullet11",0.082999997,"bullet12",0.082999997};
        };
    
    class BSF_AA12_1A_F: BSF_AA12_Base
    {
        scope=2;
        displayName="BSF AA12 1A";
        model="BSF_Community_Addon\addons\BSF_AA12\BSF_AA12_A1.p3d";
        picture="BSF_Community_Addon\addons\BSF_AA12\data\UI\icon_BSF_AA12_1A_CA.paa";
//        UiPicture = "\A3\Weapons_F\Data\UI\icon_gl_CA.paa"; /// weapon with grenade launcher should be marked such way
        weaponInfoType = "RscWeaponZeroing"; /// display with zeroing is good for iron sights
        
//        modelOptics="-";
//        muzzlePos="usti hlavne";
//        muzzleEnd="konec hlavne";
        fireSpreadAngle=0.64999998;
        discreteDistance[]={50,100,200};

        class WeaponSlotsInfo: WeaponSlotsInfo
        {
            mass=4;
            class MuzzleSlot {};
        };
    };

};

 

Share this post


Link to post
Share on other sites

You need the proper p3d model with the right skeletons. Use the armaholic guide.

Share this post


Link to post
Share on other sites

This is an old thread, but just for future reference if anyone is having the same issue.

 

I found that the arms and hands get mangled as pictured above if the RTM file is not binarised. Addon Builder will only binarise the RTM files if there is a valid model.cfg

 

class CfgSkeletons
{
	class OFP2_ManSkeleton
	{
		isDiscrete = 0;
		skeletonInherit = "";
		skeletonBones[] =
		{
			"Pelvis","",
			"Spine","Pelvis",
			"Spine1","Spine",
			"Spine2","Spine1",
			"Spine3","Spine2",
			"Camera","Pelvis",
			"weapon","Spine1",
			"launcher","Spine1",
			
			// Head skeleton in hierarchy
			"neck","Spine3",
			"neck1","neck",
			"head","neck1",
			
			// New facial features
			"Face_Hub","head",
			"Face_Jawbone","Face_Hub",
			"Face_Jowl","Face_Jawbone",
			"Face_chopRight","Face_Jawbone",
			"Face_chopLeft","Face_Jawbone",
			"Face_LipLowerMiddle","Face_Jawbone",
			"Face_LipLowerLeft","Face_Jawbone",
			"Face_LipLowerRight","Face_Jawbone",
			"Face_Chin","Face_Jawbone",
			"Face_Tongue","Face_Jawbone",
			"Face_CornerRight","Face_Hub",
			"Face_CheekSideRight","Face_CornerRight",
			"Face_CornerLeft","Face_Hub",
			"Face_CheekSideLeft","Face_CornerLeft",
			"Face_CheekFrontRight","Face_Hub",
			"Face_CheekFrontLeft","Face_Hub",
			"Face_CheekUpperRight","Face_Hub",
			"Face_CheekUpperLeft","Face_Hub",
			"Face_LipUpperMiddle","Face_Hub",
			"Face_LipUpperRight","Face_Hub",
			"Face_LipUpperLeft","Face_Hub",
			"Face_NostrilRight","Face_Hub",
			"Face_NostrilLeft","Face_Hub",
			"Face_Forehead","Face_Hub",
			"Face_BrowFrontRight","Face_Forehead",
			"Face_BrowFrontLeft","Face_Forehead",
			"Face_BrowMiddle","Face_Forehead",
			"Face_BrowSideRight","Face_Forehead",
			"Face_BrowSideLeft","Face_Forehead",
			"Face_Eyelids","Face_Hub",
			"Face_EyelidUpperRight","Face_Hub",
			"Face_EyelidUpperLeft","Face_Hub",
			"Face_EyelidLowerRight","Face_Hub",
			"Face_EyelidLowerLeft","Face_Hub",
			"EyeLeft","Face_Hub",
			"EyeRight","Face_Hub",			
			
			// Left upper side
			"LeftShoulder","Spine3",
			"LeftArm","LeftShoulder",
			"LeftArmRoll","LeftArm",
			"LeftForeArm","LeftArmRoll",
			"LeftForeArmRoll","LeftForeArm",
			"LeftHand","LeftForeArmRoll",
			"LeftHandRing","LeftHand",
			"LeftHandRing1","LeftHandRing",
			"LeftHandRing2","LeftHandRing1",
			"LeftHandRing3","LeftHandRing2",
			"LeftHandPinky1","LeftHandRing",
			"LeftHandPinky2","LeftHandPinky1",
			"LeftHandPinky3","LeftHandPinky2",
			"LeftHandMiddle1","LeftHand",
			"LeftHandMiddle2","LeftHandMiddle1",
			"LeftHandMiddle3","LeftHandMiddle2",
			"LeftHandIndex1","LeftHand",
			"LeftHandIndex2","LeftHandIndex1",
			"LeftHandIndex3","LeftHandIndex2",
			"LeftHandThumb1","LeftHand",
			"LeftHandThumb2","LeftHandThumb1",
			"LeftHandThumb3","LeftHandThumb2",
			
			// Right upper side
			"RightShoulder","Spine3",
			"RightArm","RightShoulder",
			"RightArmRoll","RightArm",
			"RightForeArm","RightArmRoll",
			"RightForeArmRoll","RightForeArm",
			"RightHand","RightForeArmRoll",
			"RightHandRing","RightHand",
			"RightHandRing1","RightHandRing",
			"RightHandRing2","RightHandRing1",
			"RightHandRing3","RightHandRing2",
			"RightHandPinky1","RightHandRing",
			"RightHandPinky2","RightHandPinky1",
			"RightHandPinky3","RightHandPinky2",
			"RightHandMiddle1","RightHand",
			"RightHandMiddle2","RightHandMiddle1",
			"RightHandMiddle3","RightHandMiddle2",
			"RightHandIndex1","RightHand",
			"RightHandIndex2","RightHandIndex1",
			"RightHandIndex3","RightHandIndex2",
			"RightHandThumb1","RightHand",
			"RightHandThumb2","RightHandThumb1",
			"RightHandThumb3","RightHandThumb2",
			
			// Left lower side
			"LeftUpLeg","Pelvis",
			"LeftUpLegRoll","LeftUpLeg",
			"LeftLeg","LeftUpLegRoll",
			"LeftLegRoll","LeftLeg",
			"LeftFoot","LeftLegRoll",
			"LeftToeBase","LeftFoot",
			
			// Right lower side
			"RightUpLeg","Pelvis",
			"RightUpLegRoll","RightUpLeg",
			"RightLeg","RightUpLegRoll",
			"RightLegRoll","RightLeg",
			"RightFoot","RightLegRoll",
			"RightToeBase","RightFoot"
		};
		// location of pivot points (local axes) for hierarchical animation
		pivotsModel="A3\anims_f\data\skeleton\SkeletonPivots.p3d";
	};
};
class CfgModels
{
	class Default
	{
		sectionsInherit="";
		sections[] = {};
		skeletonName = "";
	};
	class ArmaMan: Default
	{
		htMin = 60;		// Minimum half-cooling time (in seconds)
		htMax = 1800;	// Maximum half-cooling time (in seconds)
		afMax = 30;		// Maximum temperature in case the model is alive (in celsius)
		mfMax = 0;		// 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 = 37;		// Metabolism temperature of the model (in celsius)

		sections[] =
		{
			"osobnost", "Head_Injury", "Body_Injury", "l_leg_injury", "l_arm_injury", "r_arm_injury", "r_leg_injury", "injury_body", "injury_legs", "injury_hands", "injury_head", "clan", "clan_sign", "Camo", "CamoB", "Camo1", "Camo2", "personality", "hl", "insignia"
		};
		skeletonName = "OFP2_ManSkeleton";
	};
	class bust: ArmaMan {};
	class Male: ArmaMan {};
	class MaleSkeleton_Pivots: ArmaMan {};
};

 

  • 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

×