Model-Animations
If you load a model from G3D, DAE, FBX or X3D with embedded animations, Gorilla3D will automatically load and add all animations to the model.
Animations are handled by the TGorillaAnimationManager inside of a TGorillaModel component. By the animation manager you are allowed to browse through all available animations and to playback or stop those.
Loading of model-animations during import
Setting up a TGorillaLoadOptions record enables to import animations directly with importing the model itself.
Since 0.8.4.+ you are allowed to use this way for DAE or FBX files.
var LOpts : TGorillaLoadOptions; LOpts := TGorillaLoadOptions.Create('C:\Bellydancing.dae', nil); // forbid to import light instances (optional) LOpts.ImportLights := false; // forbid to import camera instances (optional) LOpts.ImportCameras := false; // setup automatically loaded animations LOpts.ImportAnimations := true; // setup an array of fixed size with filenames System.SetLength(LOpts.AdditionalAnimations, 2); LOpts.AdditionalAnimations[0] := 'C:\Idle.dae'; LOpts.AdditionalAnimations[1] := 'C:\Walk.dae'; // limit the size of loaded textures (optional) LOpts.TextureLimits := Point(512, 512); GorillaModel1 := TGorillaModel.LoadModelFromFile(GorillaViewport1, LOpts); GorillaModel1.Parent := GorillaViewport1; // get first animation found and playback // CAUTION: it is not the first animation you have imported. It is the first animation could be found in animation-name-hashmap. var LAnim : TGorillaAnimation; LAnim := GorillaModel1.AnimationManager.Current; LAnim.Start();
Post-loading of model-animations
In case you separated the model data from animations, you can load animations after loading the model.
- Form1.pas
GorillaModel1.AddAnimationFromFile('Bellydancing.dae', GORILLA_ANIMATION_CACHING_DEFAULT);
This is only supported for DAE files!
Playing model-animations
Play/stop current model-animation
The “Current” property of the AnimationManager represents the currently active animation or if not set yet, it will automatically select the first animation from the internal animation map.
You can simply start and stop animations by the provided methods.
- Form1.pas
GorillaModel1.AnimationManager.Current.Start();
- Form1.pas
GorillaModel1.AnimationManager.Current.Stop();
Iterating model-animations
To iterate the animation list and playback you can use the provided methods PlayNextAnimation() and PlayPreviousAnimation().
- Form1.pas
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if not Assigned(GorillaModel1) then Exit; if (KeyChar = 'e') then begin // next animation if exists if (GorillaModel1.AnimationManager.Animations.Count > 0) then begin GorillaModel1.AnimationManager.PlayNextAnimation(); end; end else if (KeyChar = 'q') then begin // previous animation if exists if (GorillaModel1.AnimationManager.Animations.Count > 0) then begin GorillaModel1.AnimationManager.PlayPreviousAnimation(); end; end; end;
Playback by model-animation name
At the moment animation names are set by the order of adding. So the first animation is called “Animation1”, the second “Animation2” and so on.
You are allowed to browse an animation by its name, by using the provided hashmap component inside of the AnimationManager.
- Form1.pas
procedure TForm1.Playback(const AName : String); var LAnim : TGorillaAnimation begin if not GorillaModel1.AnimationManager.Animations.TryGetValue(AName, LAnim) then LAnim := nil; if Assigned(LAnim) then LAnim.Start(); end;
Model-Animation caching
To animate models with a large number of vertices is very slow. Using the same animated model multiple times is also extremely slow. Due to those performance needs, Gorilla3D offers some caching techniques for model animations.
As you've seen in the previous examples for loading a model, there was a supplied parameter for animation caching: “GORILLA_ANIMATION_CACHING_DEFAULT” (Gorilla.DefTypes.pas)
Gorilla3D offers a configurable caching mechanism to suite your needs.
List of animation caching flags:
Flag | Notes |
---|---|
TAnimationCachingFlag.AllAttributes | All attributes (position, texcoord, color, normal, …) of each vertex are cached in a framebuffer object. This may be the fastest method, but memory usage is enormous. If possible use TAnimationCachingFlag.VertexPosition instead. |
TAnimationCachingFlag.Compressed | Compressed caching is recommend for large models and long animations, but will not create a framebuffer directly in GPU memory. Cached frames will be compressed inside the application memory. On MSWINDOWS x86 we use LZ4 compression for enourmous performance boost. On all other platforms we use ZLib compression algorithms by default. |
TAnimationCachingFlag.VertexPosition | Cached frames will ONLY contain the vertex position. The rest of the vertex data will come from a static mesh buffer (not animatable). This is the recommend setting for caching, because in 95% of all cases you only transform vertex position on an animation skin. |
The constant value “GORILLA_ANIMATION_CACHING_DEFAULT” uses only the VertexPosition flag as default setting:
GORILLA_ANIMATION_CACHING_DEFAULT : TAnimationCachingFlags = [VertexPosition];
Hint
It is possible to combine compressed and vertex-position caching flags to reduce the number of data compressed. Otherwise on compressed caching, full vertex data will be cached.
GORILLA_ANIMATION_CACHING_COMPRESSEDEX = TAnimationCachingFlags = [TAnimationCachingFlag.Compressed, TAnimationCachingFlag.VertexPosition]
Framerate
The caching framerate used is currently fixed to 60 FPS. But in future you should be allowed to configure this setting to reduce memory usage.
Next step: Materials