{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreiegwabshb2zhlf5y55xpdmvlxzjwuzxbgtsgbe3s5madzzgpopry4",
    "uri": "at://did:plc:dxjzgxe7cvirxkwfjr2tjspt/app.bsky.feed.post/3mj37gn7ttjc2"
  },
  "path": "/t/vlog-02-fbxloader-fixes-mixamo-models-now-loading-in-jme/49452#post_8",
  "publishedAt": "2026-04-07T17:19:32.000Z",
  "site": "https://hub.jmonkeyengine.org",
  "textContent": "adi.barda:\n\n> In Unity, it’s really convenient that you can download any FBX animation you like (without the Skin - only animation) then attach it to a model which has Mixamo bones and it works just fine. so you can have one FBX animation used by many Mixamo models - cool feature.\n\nYes, I know, it’s a good idea: my glTF pipeline is based exactly on this concept. However, Mixamo models can have different skeletons — both in bone names and total number of bones — so you can’t assume that an FBX file containing only animations will work on any model. If the skeletons are different, you’ll need to download the animation that matches each specific model.\n\nAfter a lot of effort, I also managed to fix the bugs in the `AnimMigrationUtils` class to migrate the old animation system used by `FbxLoader` to the new one. With the help of AI, I also tried converting the FBX Phong material parsing pipeline to a `PBRMaterial`. To get a correct result, I had to generate the model tangents, otherwise the normal map wouldn’t work.\n\nAs I mentioned before, no loader works 100%. Each model requires a custom conversion pipeline to fix potential issues, because models often contain anomalies.\n\nOne last aspect I still need to explore is automatic conversion from centimeters to meters for FBX models, so I don’t have to manually scale them by `0.01` every time (see my previous Java snippet).\n\nHere’s an example of an FBX model converted using `FbxLoader` that uses the new animation system and `PBRMaterial`:\n\n\n            Spatial model = assetManager.loadModel(\"Models/Mixamo/Swat.fbx\");\n            TangentBinormalGenerator.generate(model, true); // generate missing tangents\n            AnimMigrationUtils.migrate(model); // migrate from old animation system\n            FbxModelCorrector.centerRootJoint(model); // root joint (Hips) Y start position is 0.99f instead of 0\n            model.setLocalScale(0.01f);\n            rootNode.attachChild(model);\n\n            AnimComposer animComposer = model.getControl(AnimComposer.class);\n            animComposer.setCurrentAction(\"mixamo.com\");\n\n    ...\n            fpp.addFilter(dlsf);\n            fpp.addFilter(ssao);\n            fpp.addFilter(fxaa);\n            fpp.addFilter(toneMap);\n\n\nPrevious version with Lighting Material and no Filters\n",
  "title": "Vlog 02: FbxLoader Fixes: Mixamo models now loading in jME!"
}