Oblivion Animation Notes

By Sinkpoint. Contact at qixiang_DOT-chen_AT_gmail_DOT_com


This guide is intended for people experienced in 3D graphics and animation via 3dsmax or equivalent software packages.

These processes are for converting Character Studio Biped animations.

General Notes

  • CivExporter does an excellent job at exporting biped animation directly, but it can't export animation priorities on individual bones. So for some animations like attackleft etc, a fallback onto the NifTools method is the better way to save time.
  • NifTools cannot export Biped animations, so the animations must be transferred onto corresponding bones somehow. Use BipedDumper.
  • BipedDumper will create bones with "_snap" affix. They need to be renamed to match the biped names. Try to find a mass renaming script on scriptspot.com
  • Biped helpers are not used on Oblivion skeletons, nor is the Biped footstep node.

Export Notes ( NIFTools )

  • Make sure there is at least a start and end key on an object to export key information.
  • NIFTools don't like Position XYZ controllers. If NIFTools crashes on export, make sure Biped01 or Biped01 Pelvis positions are converted to Bezier controller.

3rd person

Animation in motion displacement

CivExporter

  • Animation can be exported direct from Biped, just make sure to export both X and Y as accumulated node. This will let the game properly calculate collision as the character moves in the game world.
  • Sometimes, different animation priorities are needed for different parts of the body. In this case, use the Deprecated NifTools method is the easier choice.
    • Export a file with CivExporter first, this will be the source of the Biped transformData.
    • Export a new file with NifTools with proper bone priorities. Then replace the Bip01 transformData with the ones exported from CivExporter. ( See Deprecated instructions for an idea of how to do this )

Deprecated instructions with NifTools only

The +Y axis animation displacement of BIped01 is saved in the Biped01 transform controller in the .nif file. By default the Niftools export any Biped01 animation in the Biped01 Accum transform controller instead. So the animation data need to be transfered manually via NifSkope.

Doing things manually sucks, especially when there's >2 keys. So here's a process to steamline it:

  1. create a new bone in the world space at 0,0,0 with 0,0,0 world rotation, lets call this YPOS.
  2. make sure that Biped01 starts at 0,0,0 and is facing +Y axis.
  3. copy the Y position keys from Biped01 to YPOS. And remove all Y position keys from Biped01.
  4. Now Biped animation should play in place, and YPOS happily glides along Y axis.
  5. Mark note tracks for Biped and YPOS. export to multiple kf.
  6. copy the tranform data from the YPOS accum node controller and replace the Biped01 transform data in Nifskope.


1st person

Rigging & export

With CivExporter

  • First, bake the biped into normal meshes/bones ( Either by FBX export+reimport, or by using BipedDumper )
  • Rename "Bip01" to "Bip"
  • Bake the animation of "Bip01 Footsteps".
  • Rename "Bip01 Footsteps" to "Bip01".
  • Link "Bip" to "Bip01".
  • Link "Camera01" to "Bip01", you did remember to import the camera, right?
  • Go to frame 1, delete the XY position keys on Bip. PRESERVE its Z keys.
  • *IMPORTANT* The camera's Z position determines the eye level ingame. However it's XY positions are ignored, and will be centered at Bip01's XY position.
  • Adjust the animations accordingly and use reference from camera view.
    • Use a near clipping value that reasonably approximates the ingame camera to avoid clipping adjustment headaches.
  • Sometimes there will be a need to have different animation priorities. BUT DO NOT MIX DATA BETWEEN CivExporter and Niftools. They seem to calculate relative coordinates differently, and will cause trouble. My best advice? Until NifSkope can batch adjust priorities on entire hierarchy branches, just ignore it and flush the whole skeleton with one priority. It's not a very elegant solution, but we can only see the arms anyways.

Deprecated exporting method for NifTools

The first person rigging is different from the 3rd person. This can potentially cause A LOT of headaches trying to convert 3rd person animation to first.

Normally Biped is linked as:
Biped01->Biped 01 Pelvis-> etc...
In the first person, the rigging is:
Biped01->Bip->Biped 01 Pelvis->etc...
Biped01->Camera01
Where Bip probably serves as a location marker for where Biped01 is in the 3rd person normal rigging, and Biped01 is moved to <0,0,0>. The camera then is constrained on a line extending from Biped01 to Bip. The actual game camera will not inherit any rotation, and will always look squarely down the +X axis.

If an animation is imported as is onto this rigging from the 3rd person, all hell will ensue. So the following steps must be taken first:

1. Make the animation face +X rather than +Y axis.
2. Move Biped01 to <0,0,0>

If the animation stays in place, then this should be enough. if not:

If the animation has +Y displacement in 3rd person. Then this pure +Y displacement MUST BE PRESERVED AND STILL FACE +Y. All other animations without the +Y displacement need to face +X ( See step 1 ).

Basically the following needs to be done, I'll leave the details for the sake of brevity:

  1. Copy the Y positions from Biped01 to a temporary object ( preferably a bone, so Niftool can work with it ), lets call the object YPOS.
  2. Make sure YPOS sit at x=0, z=0, with NO rotation on all axis.
  3. Remove all +Y displacement on Biped01.
  4. Rotate Biped01 to face +X
  5. Mark note tracks on both Biped01 and YPOS.
  6. export to separate .kf through Niftools.
  7. copy the tranform data from the YPOS accum node controller and replace the Biped01 transform data in Nifskope.


A more complicated approach is to bake all animations on to BIped01 Pelvis, remove all animation from BIped01, and relink Biped01 Pelvis onto Biped. This will make sure that Biped01 and Camera01 will always remain parallel to the Z axis. The steps with YPOS is still the same. This will produce results closer to the Bethesda approach. For motions with complicated Biped01 rotations that deviate a lot from the Z axis ( Say a tuck-and-roll ), this will make sure nothing screws up ( Which it will, speaking from experience).

Camera Position

The camera on the 1st person rigging is close to the mouth of the Biped head. At camera FOV of 75. Link the camera to Biped01 will give a pretty good approximation on how it will look in game.

Because of the weirdness of the Oblivion 1st person rig, it's better to reimport the animation onto oblivion 1st person bones to see how thing will look like.

Animation KeyTags

description syntax: (optional group) <literal type> [Possible Value1|Possible value2]
Tags are probably not case sensitive, but it's a good idea to match the cases anyways. ;)

start -Name <string> (-loop)
REQUIRED. Start of the animation. Naming is required for the Niftool plugin to export key data in 3dsmax. Use "-loop" for looping animation. Do not use loop for combat animations. If used, animation will revert to first frame when done playing, this leads to animation jumps ingame.

end
REQUIRED. Marks the end of the animation range to export.

Hit
Where the hit should be registered in an animation. This also triggers the "woosh" sound on weapon swing?

Attack
Used by *BlockAttack animations for mark where the counter attack should be registered.

a:[L|R]
Tells the engine where the next attacks on the alternate hand is allowed to begin. Used in in-place animations such as *AttackLeft, *AttackRight, etc. L means left.

m:[L|R]
Mark where the corresponding Left or Right foot hits the ground, and where to blend to next foot.

Enum:<string>
Marks where certain sounds should be played.

Left
Left foot step sound
Right
Right foot step sound

Sound:<string>
Play sound at marked frame.

WPNHitHand
Empty hand impact sound

Blend:<Int>
Define a range of animation priorities for all bones in the animation. The existing priorities are modified to fit within +-<Int> range, where int is the blending integer priority defined. This is applied to the entire animation.


Animation Priorities

Existing animation priorities found from game files.

75 - Block hit upper body

66 - Shield blocking arm bones uses this.

57 - Torches holding arm uses this.

56 - Blocking arms use these

55 - In place attacking arms use this.

46 - The right arm in shield blocking uses this.

26 - Block hit lower body

25 - In place attacking feet use this.