Player Setup

Characters in T3D can be setup to use different weapon animations and share those animations between different skinned meshes with the same skeleton hierarchy. So a standard T3D character would have COLLADA files for the character’s skinned mesh and skinned skeleton as well as for the character’s animations with just the skeleton for each weapon pose. The animations can be exported individually or combined in one .dae file that is split up through the shape editor.

Third Person Weapon Player Animation Names

Back: (Loops)

Run backward

Crouch_Back: (Loops)

Crouch walk backward

Crouch_Forward: (Loops)

Crouch walk forward

Crouch_Root: (Loops)

Crouch idle

Crouch_Side: (Loops)

Crouch move right

Death#:

Where ‘#’ is can be a number for multiple death sequences that will be picked randomly. So Death1, Death2, etc.

Fall: (Loops)

Character is falling

Head: (Blend)

Usually a 9 frame animation that only affects the neck and head and works in conjunction with the “Look” animation. Frame 1 is looking straight up, frame 5 is looking straight forward and 9 is looking down

Jump:

Character jumping

Land:

Character landing

Look: (Blend)

Usually a 9 frame animation that only affects the spine and works in conjunction with the “Head” animation. Frame 1 is looking straight up, frame 5 is looking straight forward and 9 is looking down

Reload: (Blend)

Reloading the weapon

Root: (Loops)

More commonly known as the idle animation in most parts of the industry. Just the character standing and breathing

Run: (Loops)

Character running

Side: (Loops)

Character side stepping to the right. This animation will be played in reverse when moving to the left

Sitting: (Loops)

Character sitting in a vehicle

Swim_Back: (Loops)

Swimming backward

Swim_Forward: (Loops)

Swimming forward

Swim_Idle: (Loops)

Treading water

Swim_Left: (Loops)

swimming left

Swim_Right: (Loops)

Swimming right

After that you add the animations through the shape editor by going to sequence tab (labeled “Seq”). Click on the new sequence icon and a file browsing dialog will open. Select the sequence COLLADA file you want. Now define the time range that you want by changing the numbers at the beginning and end of the timeline. Complete this process for each sequence that you wish to add.

Optionally you can define an object called “BOUNDS” that can be used to define the object's origin (as opposed to your 3d content application’s origin) and is used to define the speed that the object is intended to be moving at. Such as during a run sequence, if you had a character running forward at 1 meter a second in your 3d application’s scene and had the “BOUNDS” object follow your character then when you bring it into Torque 3D and assigned to the player’s run animation then the playback speed of the animation can be adjusted depending on the speed that the player is moving through the game world. What this means is that animations don’t have any sliding issues caused by the character's in game speed not matching with the designed animation speed.

Hitboxes and Damage Location specifications

Currently, the player's hitbox defined by their bounding box. In order to get damage locations we have cut the player's world box up into pieces as defined by the following sections in the Player's datablock:

  • boundingBox

  • boxHeadPercentage

  • boxTorsoPercentage

  • boxHeadLeftPercentage

  • boxHeadRightPercentage

  • boxHeadBackPercentage

  • boxHeadFrontPercentage

The player's boundingBox determines the length in each dimension the bounding box should encompass. From the standard player datablock, its sections would look like the following:

It may be easiest to come up with these numbers by taking a render of the player, and using an imaging program to determine what percentage of the player makes up their legs/head/torso.

In order to take advantage of these damage locations we use the function Player::getDamageLocation(). One of the best places to call this is from the Projectile:onCollision or Armor::Damage() as we'll have the position of the projectile, the player to call getDamageLocation() and a good place to modify the damage if we wanted to do extra damage on a headshot or less damage to the legs.

GetDamageLocation() will return a string using the defined boundingbox percentages from the player datablock. In C++ it more or less transforms the projectile's location form world space to object space, multiplies the player's bounding box by its percentages, then checks to see if the hit location is greater than, or less than the bounding box dimension multiplied by the percentage. For example, if the bounding box's dimension was 1, it will multiply 1 by 0.43, and check if the bullet's location is less than or equal to this value. If it's less than the torso, then it counts as a leg shot. The system then does the same test in the other dimensions to see if the front/back or left/right was hit.

The string returned will be one of the following:

Possible locations:

  • legs

  • torso

  • head

Head modifiers:

  • left_back

  • middle_back

  • right_back

  • left_middle

  • middle_middle

  • right_middle

  • left_front

  • middle_front

  • right_front

Legs/Torso modifiers:

  • front_left

  • front_right

  • back_left

  • back_right

For example, a perfect headshot would be “head_middle_front”, head_middle_back, or “head_middle_middle”. A shot to the front left leg would be “legs_left_front”.

As we can see in the picture, there are situations where we can register a hit from the headbox that actually wouldn't “hit” the player. Such as shooting a bullet in the boxHeadRightPercentage area from the front of the player would fly over the player shoulder, but register a hit in the engine. It may be necessary to do some math to see if the bullet will actually pass through the center of the player's head box to get realistic results.

Last updated