fbxsdk是用来读写autodesk的fbx的库,但是是一个c++库,在java上无法直接使用,也没有找到有人做了这个工作,只好自己写一个jni的库
原理:
- 使用lynx从 http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/cpp_ref/hierarchy.html 把文档抓下来,转成文件.
- 写了一个shell的脚本把转成普通文本的文档进行分析,找出类名,方法和属性,自动生成对应的cpp和java文件
- 手动修复少量的文档错误和增加一些辅助类的工具,加上文档中没有的枚举值
- 编写makefile,编译成JNI的动态库
-
java程序开始时,加载一下System.loadLibrary("FbxsdkJni"), 然后就可以用了。
代码在
https://github.com/aerror2/FbxsdkJNI
使用例子:
private long createSkeletonNode(long pScene, String name, long mt,
double size, int type) {
long lpSkeleton = FbxSkeleton.Create(pScene, name);
FbxSkeleton.SetSkeletonType(lpSkeleton, type);
FbxSkeleton.mepSetSize(lpSkeleton, size);
long lSkeletonNode = FbxNode.Create(pScene, name);
FbxNode.SetNodeAttribute(lSkeletonNode, lpSkeleton);
long t = FbxAMatrix.GetT(mt);
long r = FbxAMatrix.GetR(mt);
long s = FbxAMatrix.GetS(mt);
FbxNode.mepSetLclTranslation(lSkeletonNode, t);
FbxNode.mepSetLclRotation(lSkeletonNode, r);
FbxNode.mepSetLclScaling(lSkeletonNode, s);
FbxVector4.meDestroy(t);
FbxVector4.meDestroy(r);
FbxVector4.meDestroy(s);
return lSkeletonNode;
}
test()
{
long mgr = FbxJnimgr.meCreate();
long lpScene = FbxJnimgr.GetScene(mgr);
long lpMesh = createFbxMesh(mgr,lpScene,meshData);
long famt = FbxAMatrix.meCreate();
FbxAMatrix.SetTRS(famt, t1, r1, s1);
long lpRootNode = FbxScene.GetRootNode(lpScene);
long lSklNode = createSkeletonNode(pScene, n, famt, 100.0, FbxSkeleton.EType.eRoot);
FbxNode.AddChild(lpRootNode, lSklNode);
FbxJnimgr.SaveScene(mgr, lpScene, outputfileNanme);
FbxJnimgr.meDestroy(mgr);
}