FBX Models can be exported from various 3D editors and loaded into Heaps.
Heaps uses its own internal 3D format called HMD which is faster to load and process. By default, the Heaps resource manager will automatically convert any FBX it loads into the corresponding HMD and cache the result. See this section.
In order to export a FBX model that can be load to HMD, please make sure to:
- export to FBX 2010 (FBX version 7.x), both FBX binary and text format are supported.
- export using
Z
-up and-Y
-forward axis. - export using BakeAnimation, this will make sure your animation is exactly the same it was created.
- note for 3ds Max and Maya: Use Game Exporter instead of standard Export.
- note for Blender 2.8: use FBX Units Scale in "Apply Scaling" under Main tab and reduce Simplify to 0 under Animation tab when exporting to FBX. This will preserve the correct armature scaling and prevent animation jitters.
Some restriction apply to the structure of your models when using FBX export:
- the same Skin cannot be shared among several objects. Merge your objects, using multiple materials if necessary.
- try to avoid attaching objects to skin bones. Instead attach by code by using the
follow
property. - not all animation curves are supported. Please make an issue and provide example model if you encount unsupported animation curves.
In order to add a FBX/HMD model to your scene, you need first to load it with the Resource manager. There are two primary ways of doing so.
Most robust way is to use ModelCache
class:
// Create a model cache
var cache = new h3d.prim.ModelCache();
// Add a model library to cache.
// This is optional, because `loadModel` and `loadAnimation` add it to cache automatically.
// Returns hxd.fmt.hmd.Library
cache.loadLibrary(hxd.Res.myModel);
// Create a model instance. Compared to manual model creation, ModelCache loads textures automatically.
var obj = cache.loadModel(hxd.Res.myModel);
// Load an animation.
var anim = cache.loadAnimation(hxd.Res.myModel);
// play it on the object
obj.playAnimation(anim);
// Clear the cache instance. Note that cache will dispose all cached model textures as well.
cache.dispose();
Another thing to note is that how texture loading resolves texture paths. First it tries to load from directly provided texturePath
, then, if it fails - relative to passed model. E.g. in case of folder structure like that:
texture.png
models/myModel.fbx
models/texture.png
It will resolve to top-level texture.png
instead of models/texture.png
when loading hxd.Res.models.myModel
if model requests path as texture.png
.
Alternatively it is possible to load models directly from Library:
// lib is an hxd.fmt.hmd.Library
var lib = hxd.Res.myModel.toHMD();
// create the model instance : the loadTexture is a custom function responsible for loading the model texture
var obj = lib.makeObject(loadTexture);
// add to the scene
s3d.addChild(obj);
// load the animation
var anim = lib.loadAnimation();
// play it on the object
obj.playAnimation(anim);
Please note that the HMD library and animations are not cached. If you want to be able to create many instances of the same object in your scene, make sure to cache the values so they can be reused.
A complete example is available in the samples/skin
directory.