TrickyVein Posted May 3, 2013 Share Posted May 3, 2013 (edited) It is more than possible to set up your own custom, quality animations for objects inside of Nifskope. The good news is that you don't need to know how to export animations from some fancy 3D modeling application to animate most of the things you want (stuff which isn't rigged to a skeleton). So doors, rotating fans, drifting buoys, etc.The bad news is that the NiControllerManager which manages animation is an intimidating beast. It is opaque, its hierarchy is sprawling, and the block-names can be foreign to even the most experienced Nifskope user.This tutorial (with lots of pictures!) will direct you how to set up the essential architecture of some basic, working animation for a door. You can use this knowledge to go off and build your own animations for a variety of different things, as it is very easy to customize once the core-framework has been put into place. It will help if you have something you wish to animate. I have attached a .nif which is set up the same way as the door used in the tutorial. (Note that the nodes are named differently.) Example .NIF [/line] Part I.To begin, grab Nifskope if you don't already have it (available here) and load something you want to animate.http://imageshack.us/a/img812/9071/nifcntrlmngrtut01.jpgHere is my door. I have my root node, 'Scene Root' and three NiNodes attached to it as children; the door frame, 'unstndoor01frame;' left door and right door, 'unstndoor01right' and 'unstndoor01left' respectively.http://imageshack.us/a/img12/4168/nifcntrlmngrtut02.jpgI want to collect my NiNodes into a new NiNode and name it '<whatever your root node is named> NonAccum.' In this example, my root node is called 'scene root' so I'm calling my new NiNode 'SceneRoot NonAccum.'Attach your new NiNode to your root node as the only child.http://imageshack.us/a/img507/7988/nifcntrlmngrtut03.jpgNow we will insert a new NiControllerManager, proper.Don't worry about attaching it to anything just yet. There's a lot to pay attention to, and it's easiest to understand this tutorial if you follow through all of the steps before jumping ahead. You will find that things can become quite cluttered and hard to follow as there are many branches to keep track of.http://imageshack.us/a/img267/1379/nifcntrlmngrtut04.jpgNow we will enter some numbers into these different fields shown for the NiControllerManager:QuoteFlags: 76Frequency: 1.0000Start Time: <Float_Max>*Stop Time: <Float_Min>Reference your root node (should be index = 0) in the 'Target' field. You can also define the number of sequences you wish to manage (for this example, two), though it's not essential at this point.You may think that you want to define the real start and stop times for your animation, but it's not necessary. 'Float_Max' and " min mean that t-values that we define later on will be carried on through to the manager and we don't have to worry about actually defining them at this point. It's useful. *Select these values by right-clicking in the data field.Now, on to the next step. Every NiControllerManager must be supplied with an Object Palette.http://imageshack.us/a/img801/4109/nifcntrlmngrtut05.jpgInsert a new NiDefaultAVObjectPalette. Now we have to make it functional.[/line] Continued in part II. Edited May 6, 2013 by TrickyVein Link to comment Share on other sites More sharing options...
TrickyVein Posted May 3, 2013 Author Share Posted May 3, 2013 (edited) Part II.[/line] The Object Palette serves to 'collect' or list all of your NiTriStrips and NiNodes and other blocks contained in your root node. All of them. Even your root node and objects which your aren't going to animate. Actually, you may just need to list only the blocks that are controlled/referenced by the different interpolators collected in each ControllerSequence. It doesn't seem to do anything if you just go ahead and list everything anyway. Except for collision objects. Notice that these are excluded.Figure out how many objects you need to add to the list, then update your array and reference each of your blocks like shown (highlighted in red).*IMPORTANT* It is essential that you provide the string-name in the 'name' field if you want your animations to play in-game. http://imageshack.us/a/img687/8371/nifcntrlmngrtut06.jpg After you're confident you've grabbed everything in your palette - you can always go back and add more - attach it to your NiControllerManager. http://imageshack.us/a/img32/6809/nifcntrlmngrtut07.jpg Now, we're going to insert another controller, the NiMultiTargetTransformController. http://imageshack.us/a/img826/4828/nifcntrlmngrtut08.jpg In your NiControllerManager, link to your new NiMultiTargetControllerManager as the next controller. Update the start and stop times, set the flags and enter a frequency value as before for the NiControllerManager. http://imageshack.us/a/img835/1158/nifcntrlmngrtut09.jpg In your new NiMultiTargetTransformController, link to the NiNodes that you wish to animate.For this example, I have two doors that I want to swing open, so I have two extra references which I link to my NiNodes for my two doors, left and right. http://imageshack.us/a/img687/8186/nifcntrlmngrtut10.jpg The next step is setting up the actual animation sequence(s) for your objects. This is done through the NiControllerManager. Under 'sequences' input the number you wish to have. For this example, I want two sequences: one for opening the door, and one for closing it. I am going to call them 'open' and 'close.' Let's work on them one at a time.Note that the names of some sequences may represent AnimGroups and be recognized as the engine as such. This is important for setting up activators, for instance which by default will play their 'forward' animation OnActivate. http://imageshack.us/a/img407/7691/nifcntrlmngrtut11.jpg Your new NiControllerSequence has to be configured correctly before we proceed. http://imageshack.us/a/img43/6086/nifcntrlmngrtut12.jpg Input these data, as shown (highlighted in red in the picture): Cylce Type: CYCLE_CLAMPFrequency: 1.0000Start Time: 0.0000Stop Time: 1.0000Manager: <Your own NiControllerManager>Target: <Your own root node> You'll notice that we define the actual start and stop times for the animation here. These, of course, can be anything you want.The manager has to reference back to your original NiControllerManager; The target has to reference your original root node.I have two objects which I need to animate for my first sequence (I want both of my doors to swing open when I click on my door) - therefore, for this example, I am going to have two controlled blocks in my first NiController Sequence.Let's set that up. http://imageshack.us/a/img407/9089/nifcntrlmngrtut13.jpg Controller: <name of your NiMultiTargetTransformController>Node Name: name of the node you wish to control. For this example, the right door.Controller Type: NiTransformController *This is user-defined. Input this text yourself. You'll notice that I haven't defined anything under Interpolator: All we need to do now is keyframe our actual animation. Let's talk about setting up the interpolator next. [/line] Continued in Part III. Edited October 30, 2013 by TrickyVein Link to comment Share on other sites More sharing options...
TrickyVein Posted May 3, 2013 Author Share Posted May 3, 2013 Part III.[/line] Insert a new NiTransformInterpolator into your block list. http://imageshack.us/a/img259/614/nifcntrlmngrtut14.jpg Every kind of interpolator needs its own kind of data. The type depends on what you want to do with it.For the NiTransformInterpolator, add some NiTransformData. http://imageshack.us/a/img89/1461/nifcntrlmngrtut15.jpg This is where we actually key-frame our animation. You're going to need at least two keys, corresponding to your start and stop times - defined in the parent controller sequence.For this kind of animation, I've chosen LINEAR_KEY But there are other kinds of transformations you can use. It depends on what kind of animation you want to achieve.This is a simple, swinging door so I only care about one rotation axis. I'm going to actually input these data later.For now, we're going to plug everything into the sequence, then the controller manager. http://imageshack.us/a/img13/4338/nifcntrlmngrtut16.jpg Go back to your first controlled block in your first NiControllerSequence and link to the NiTransformInterpolater that we just set up. http://imageshack.us/a/img526/9869/nifcntrlmngrtut17.jpg Also plug-in your Controller Sequence into your Controller Manager if you have not already. [/line] Continued in Part IV. Link to comment Share on other sites More sharing options...
TrickyVein Posted May 3, 2013 Author Share Posted May 3, 2013 (edited) Part IV. Finally.[/line]Finally, plug your NiControllerManager into your root node. http://imageshack.us/a/img163/1281/nifcntrlmngrtut18.jpg Do you see why I've set up the tuorial like I have? It would have been very easy to get lost in what was referencing what as a target or a parent, etc. It can be verry messy and confusing to keep track of.This way, you should have everything set up correctly before attaching it to a parent.But who knows, you can still get lost. http://imageshack.us/a/img545/820/nifcntrlmngrtut19.jpg If you've set up everything correctly, Nifskope should recognize the sequence you just created.If you can select your sequence from the drop-down box in the upper right (as shown) and if it 'plays' then you have been successful.Now I can actually worry about key-framing my animation, knowing that the basic structure of my animation is correct. http://imageshack.us/a/img856/1851/nifcntrlmngrtut20.jpg Here I am defining how far out I want my door to rotate.To finish key-framing the rest of your nif, simply cut and past the branches you need. This is incredibly time-saving and useful. Thanks, Nifskope! http://imageshack.us/a/img832/4153/nifcntrlmngrtut21.jpg I can duplicate an extra NiTransformInterpolator to control my other door for my first sequence; http://imageshack.us/a/img849/8071/nifcntrlmngrtut22.jpg You can even duplicate entire controller sequences! Make sure to reference the correct NiTransformInterpolator and NiTransformData for each of the separate NiNodes you wish to animate. http://imageshack.us/a/img545/1149/nifcntrlmngrtut24.jpg Just adjust and change whatever data you need for both doors, for both sequences (for this example), http://imageshack.us/a/img202/8895/nifcntrlmngrtut23.jpg ...and if everything is set-up, your other sequence should also be viewable. Play the animation and have fun! http://imageshack.us/a/img543/7413/nifcntrlmngrtut25.jpg[/line] Some notes about setting up different kinds of animation:There are lots of things that you can control through the NiControllerManager.Not just the movement of entire objects; material properties; moving textures; the scale of an object. Each of these has its own kind of controller and data.For a looping, or idle animation, simply selectQuoteCYCLE_LOOPinstead ofQuoteCYCLE_CLAMPFor your controller sequence. You probably only want to use one sequence if it's going to be looping. Setting a 'forward' and 'backward' animation also is useful for integrating scripts with custom animation sequences for objects or activators inside of the GECK. That could be the topic for another tutorial.To add text-key data to your sequences, addNiTextKeyExtraDataunder your controller sequence\text keys. This is useful for naming your sequences as well as playing sounds. You can see how this is done by looking at one of Bethesda's assets. In Nifskope. Note that your collision object, if attached to an animated node itself must be configured to move with its parent body. Configure your BhkRigidBody or BhkRigidBodyT with the following properties (from dropdown fields): Layer: OL_ANIM_STATICLayer Copy: OL_ANIM_STATICMotion System: MO_SYS_KEYFRAMEDDeactivator: DEACTIVATOR_NEVERSolver Deactivation: SOLVER_DEACTIVATION_OFFQuality Type: MO_QUAL_FIXED Your collision object should now be highlighted in pink instead of red, by default. Edited October 30, 2013 by TrickyVein Link to comment Share on other sites More sharing options...
Pelgar Posted May 3, 2013 Share Posted May 3, 2013 Just wanted to say thanks, looks like a lot of very useful information. I'm just getting into animation for FNV, this should be very helpful. Link to comment Share on other sites More sharing options...
TrickyVein Posted May 3, 2013 Author Share Posted May 3, 2013 We can only hope. Thanks for reading - it's a lot to digest - would be great to have your feedback :) Link to comment Share on other sites More sharing options...
Pelgar Posted May 4, 2013 Share Posted May 4, 2013 It'll probably be a day or two but I plan to work all the way through your tutor. I'll be glad to give you all the feedback I can. I haven't even read all of your tutor yet but since I've been having a bit of a problem with some looping anims. I skipped down to the Cycle_Clamp to Cycle_Loop section, the keyword being skipped so I could have missed something. Have you ever got an existing non-looping anim. to loop by simply changing Cycle_clamp to Cycle_Loop? I've tried this several times in NifSkope but the Geck still does not see it as a looping anim. i.e. the Loop Forever check box is greyed out. The only way I've found to fix this is to load the anim. into Blender and add the StartLoop and EndLoop Text keys. The trouble with that method is most of the anims. I can find won't even load into Blender. The Nif Script errors out with non-oblivion .kf not supported or something. Umpa's dance anims. are a good example of that problem.If there is any way to add the StartLoop and EndLoop Text Keys via NifSkope I'd love to see that added to your tutor. Thanks again for all the hard work you put into the tutor. Link to comment Share on other sites More sharing options...
Pelgar Posted May 5, 2013 Share Posted May 5, 2013 I have read your entire tutor now. I think it would be a lot more helpful to me if I had the unstndoor01 parts you use as an example. I've extracted quite a few meshes from FNV's meshes.bsa but the only ones I can find that even have NiNode properties are already animated. All of the non-animated meshes I've looked at are using niTriStips. I'm simply not strong enough with NifSkope to work out what I need to do with them.I assume the .nif your tutor is using is something you put together, I can't find any unstndoor files in any of the FNV bsa's that contain meshes. Thanks Link to comment Share on other sites More sharing options...
TrickyVein Posted May 6, 2013 Author Share Posted May 6, 2013 (edited) There is a way to add text-key data to your sequences. I'll add this step in. It's as simple as adding some 'textkeydata' and linking to it in your controller sequence. I was thinking about attaching the resource used in the tutorial (it's my own - and the dimensions don't match Bethesda's chosen standard for a small door) - perhaps this is a good idea. The whole point, of course, is that the NiControllerManager hierarchy is completely transferable. Nothing in this tutorial is dependent on the names or total number of nodes you want to animate - at least I hope it doesn't seem that way. OK - I modified one of Bethesda's resources and attached it to the OP. It's set up the exact same way. You've got a frame, a left door and a right door. Edited May 6, 2013 by TrickyVein Link to comment Share on other sites More sharing options...
Pelgar Posted May 6, 2013 Share Posted May 6, 2013 Thanks TrickyVein, I think the nif will be helpful to some of us that are still trying to get a handle on NifSkope. I'll work through the tutor with it and let you know how it goes. Thanks for the info on adding textkeydata as well. I've been doing a lot of experimenting with animation, being able to add that data will be very helpful. Link to comment Share on other sites More sharing options...
Recommended Posts