Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用ASIMP导出可在Unity中使用的fbx文件?_C#_Unity3d_Export_Fbx_Assimp - Fatal编程技术网

C# 如何使用ASIMP导出可在Unity中使用的fbx文件?

C# 如何使用ASIMP导出可在Unity中使用的fbx文件?,c#,unity3d,export,fbx,assimp,C#,Unity3d,Export,Fbx,Assimp,我使用ASIMPNET在运行时从Unity导出具有蒙皮网格、骨架和动画的fbx文件。fbx文件在导入到Blender或Maya时工作良好,但在打开Unity editor导入文件时,播放动画时装备上的位置值会非常混乱。它甚至会使检查器中的动画预览面板崩溃 Unity在播放动画时会出现一些AABB错误,这可能表明由于NaN值,Unity无法计算边界,但我不知道为什么首先会有这些NaN值。它们不存在于Blender或Maya中 公共类ExportController:Singleton { 公共助理

我使用ASIMPNET在运行时从Unity导出具有蒙皮网格、骨架和动画的fbx文件。fbx文件在导入到Blender或Maya时工作良好,但在打开Unity editor导入文件时,播放动画时装备上的位置值会非常混乱。它甚至会使检查器中的动画预览面板崩溃

Unity在播放动画时会出现一些AABB错误,这可能表明由于NaN值,Unity无法计算边界,但我不知道为什么首先会有这些NaN值。它们不存在于Blender或Maya中

公共类ExportController:Singleton
{
公共助理ExportFormatDescription[]FormatID;
public enum ExportFormat//对应于Assimp格式的索引
{
无=-1,
FBX=17,
GLTF=12,
GLTF2=10,
DAE=0,
计数
}
公共int ticksPerSecond=60;
公共浮动间隔=>1.0f/ticksPerSecond;
private readonly AssimpContext assimp=new AssimpContext();
私密场景;
私人助理动画输出动画;
私有帧;
私人布尔bindPoseSet;
公共图书馆;
公共出口;
公共导出格式导出格式;
大众新动漫;
社会进步;
私有int fbxCallback;
私有int-gltfCallback;
私有int回调;
私有内部调用;
公共字符串输出文件夹;
私有void Start()
{
formatId=assimp.GetSupportedExportFormats();
fbxCallback=EventHandler.Instance.AddListener(EventHandler.UIEvent.RequestFBXExport,()=>OnRequestExport(ExportFormat.FBX));
gltfCallback=EventHandler.Instance.AddListener(EventHandler.UIEvent.RequestGLTFExport,()=>OnRequestExport(ExportFormat.GLTF));
gltf2Callback=EventHandler.Instance.AddListener(EventHandler.UIEvent.RequestGLTF2Export,()=>OnRequestExport(ExportFormat.GLTF2));
daeCallback=EventHandler.Instance.AddListener(EventHandler.UIEvent.RequestColladaeExport,()=>OnRequestExport(ExportFormat.DAE));
outputFolder=UserSettings.Instance.modelExportPath.GetValue();
}
私有无效不可撤销()
{
if(EventHandler.Instance)
{
EventHandler.Instance.RemoveListener(EventHandler.UIEvent.RequestFBXExport,fbxCallback);
EventHandler.Instance.RemoveListener(EventHandler.UIEvent.RequestGLTFExport,gltfCallback);
EventHandler.Instance.RemoveListener(EventHandler.UIEvent.RequestGLTF2Export,gltf2Callback);
EventHandler.Instance.RemoveListener(EventHandler.UIEvent.RequestCOLLADAExport,daeCallback);
}
}
私有void更新()
{
如果(请求出口)
{
动画=RigReferences.Instance.effectorParent.GetComponent();
初始化导出();
exportrequest=false;
导出=真;
}
else if(导出)
{
进度=animation.currentTime*ticksPerSecond/(float)exportedAnimation.DurationInTicks;
SampleNextFrameOfAnimation();
ExportFrame();
递增滴答();
CheckIfExportFinished();
}
}
私有void OnRequestExport(ExportFormat ExportFormat)
{
this.exportFormat=exportFormat;
exportrequest=true;
}
私有void InitializeExport()
{ 
EventHandler.Instance.InvokeeEvent(EventHandler.UIEvent.RequestExitMotionCapture);
outputFolder=UserSettings.Instance.modelExportPath.GetValue();
animation.playing=false;
animation.currentTime=0;
currentExportFrame=0;
进度=0;
bindPoseSet=false;
ValidateFileExists(RigReferences.Instance.importPath);
场景=assimp.ImportFile(RigReferences.Instance.importPath,PostProcessSteps.OptimizeGraph
|后处理步骤.优化网格
|PostProcessSteps.GlobalScale
|后处理步骤。限制BoneWeights
|后处理步骤.联合标识属性
|后处理步骤。验证数据结构);
/*元数据*/
scene.RootNode.Metadata[“FrameRate”]=新的Metadata.Entry(MetaDataType.Int32,ticksPerSecond);
scene.RootNode.Metadata[“FrontAxisSign”]=新的Metadata.Entry(MetaDataType.Int32,-1);
scene.RootNode.Metadata[“OriginalUnitScaleFactor”]=新的Metadata.Entry(MetaDataType.Int32100);
scene.RootNode.Metadata[“UnitScaleFactor”]=新的Metadata.Entry(MetaDataType.Int32,1);
/*元数据*/
exportedAnimation=新辅助动画
{
Name=“SwiftAnimation剪辑”,
TicksPerSecond=TicksPerSecond,
DurationInTicks=animation.duration*ticksPerSecond,
};
scene.Animations.Clear();
场景.动画.添加(导出动画);
animation.requestPose.Invoke();
EventHandler.Instance.InvokeeEvent(EventHandler.SystemEvent.ExportInitialized);
}
私有静态void ValidateFileExists(stri