UE4自动导入模型

本文详细介绍了一种在UE4中实现FBX模型自动化导入的方法。通过创建自定义的AutoLoad类,使用UFbxFactory进行模型导入,并在导入前利用Upackage确保目标路径的有效性。文章深入讲解了如何设置FBX导入参数,包括模型类型、纹理和材料的导入选项,以及如何处理导入后的静态网格体。同时,介绍了如何自动创建缺失的资产文件夹和包文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:基本思路就是选择一个FBX文件的路径,利用UFbxFactory的ImportObject 导入模型, 在这之前要先去利用Upackage去创建对应的路径。

1.首先创建一个继承与Object的类名字叫做AutoLoad
Autoload.h文件

UCLASS()
class DAY1_API UAutoLoad : public UObject
{
	GENERATED_BODY()
public:

	void InitImport(FString Name);

	UObject* autoInput(FString path);
	
	//最重要的FBX导入器 , 调用ImportObject 导入模型
	class UFbxFactory* FBXmanage;


	//路径
	FString Absolute_Base;


	//需要保存的资源的文件夹
	FString BasePKGPath;

	//取消导入
	bool&& Canceled = false;
};

2.Autoload.cpp

 //这个方法是为了创建一个FBX文件的路径, 也可以直接调用autoimprot给绝对路径
void UAutoLoad::InitImport(FString Name)
{
	Absolute_Base = FPaths::ProjectDir() + "/Model/";
	FString Path = Absolute_Base / Name;
	autoInput(Path);
}


//主要的导入函数
UObject* UAutoLoad::autoInput(FString path)
{
	//实例化FBXFactory
	FBXmanage = NewObject<UFbxFactory>();
	//给FBXFactor 创建Task
	UAssetImportTask* ImprtTask = NewObject<UAssetImportTask>();
	
	BasePKGPath = TEXT("Asset");

	//先去判断文件夹有没有
	if (BasePKGPath!=TEXT(""))
	{
		//没有就去创建
		if (FPaths::DirectoryExists(FPaths::ProjectContentDir()+BasePKGPath))
		{
			IPlatformFile& R = FPlatformFileManager::Get().GetPlatformFile();
			if (!R.CreateDirectoryTree(*(FPaths::ProjectContentDir()+BasePKGPath)))
			{
				UE_LOG(LogTemp, Error, TEXT("Error  Can't Create Directory"));
			}
		}
	}

	//设置参数
	if (FBXmanage)
	{
		//导入的类型
		FBXmanage->ImportUI->MeshTypeToImport = FBXIT_StaticMesh;
		FBXmanage->ImportUI->OriginalImportType = FBXIT_StaticMesh;

		//ImprotTask参数设置
		ImprtTask->bAutomated = true;
		ImprtTask->bSave = true;
		
		//如果FBXFactir 没有默认的AssetTask,就去设定一个上面声明的
		if (!FBXmanage->AssetImportTask)
		{

			FBXmanage->SetAssetImportTask(ImprtTask);
		}
		/*************************
		自动导入, 设置导入的辅助类
		**************************/
		/*UnFbx::FFbxImporter* FbxImporter = UnFbx::FFbxImporter::GetInstance();*/
	/*	UnFbx::ApplyImportUIToImportOptions(FBXmanage->ImportUI, *FbxImporter->ImportOptions);*/
		FBXmanage->ImportUI->StaticMeshImportData->bCombineMeshes = true;
		FBXmanage->ImportUI->StaticMeshImportData->ImportUniformScale = 1.0f;
		FBXmanage->ImportUI->bImportMaterials = true;
		FBXmanage->ImportUI->bImportTextures = true;
		FBXmanage->ImportUI->bAutoComputeLodDistances = true;
		FBXmanage->ImportUI->StaticMeshImportData->bAutoGenerateCollision = true;
		if (FBXmanage->FactoryCanImport(path))
		{
			UE_LOG(LogTemp, Error, TEXT("可以导入这个模型"));
		}
		//现在开始建立Package文件
		FString Name = FPaths::GetBaseFilename(path);
		FString PKGNames = "/Game/" + BasePKGPath;
		int ExtPos = Name.Find(TEXT("/"), ESearchCase::CaseSensitive, ESearchDir::FromEnd);

		if (ExtPos!=INDEX_NONE)
		{
			Name.Right(ExtPos);
		}

		PKGNames = PKGNames + "/" + Name;
		UPackage* DirectFolder = FindPackage(nullptr, *PKGNames);
		if (!DirectFolder&&FEditorFileUtils::IsMapPackageAsset(PKGNames))
		{
			ensure(false);
		}
		if (!FPackageName::DoesPackageExist(PKGNames))
		{
			DirectFolder = CreatePackage(nullptr, *PKGNames);  //创建目录
			if (DirectFolder)
			{
				DirectFolder->FullyLoad();
			}
			else
			{
				UE_LOG(LogTemp, Error, TEXT("Create DirectFloder Failed"));
			}
		}

		//导入完成的回调
	/*	FEditorDelegates::OnAssetPostImport.AddUFunction(this, "ok");*/
		FBXmanage->ImportObject(UStaticMesh::StaticClass(), DirectFolder, *Name
			, EObjectFlags::RF_Transactional | EObjectFlags::RF_Public | EObjectFlags::RF_Standalone, path, nullptr, Canceled
		);

		//到此导入完成

		//如果是复合模型, 需要重新导入
		//FString PkgNames = FPaths::GetBaseFilename(Paths);
			//UObject* Pkg = StaticFindObject(UObject::StaticClass(), DirectFloder, *PkgNames);
			//if (Pkg)
			//{
			//	FReimportManager::Instance()->Reimport(Pkg, false, true);
			//}

	}
	return nullptr;
}
<think>好的,用户遇到的问题是Unreal Engine导入模型时缺少三角面。首先,我需要分析可能的原因。根据引用内容,STL文件使用三角网格表现3D模型,如果导入时缺少三角面,可能与模型本身的三角面数量或结构有关。 首先,用户需要检查原始模型文件。引用[3]提到STL文件由三角面片构成,如果导出时设置不正确,可能导致三角面丢失。建议用户确认导出设置是否正确,确保勾选了导出三角面选项。例如,某些软件如Blender或Maya在导出时可能需要明确选择三角化网格。 接下来,模型优化可能导致问题。引用[2]指出,如果模型子对象数量过多,直接简化三角网可能有问题,建议拆分子对象。用户应检查是否在建模过程中进行了过度简化或优化,这可能导致部分三角面被错误删除。可以尝试在导出前禁用自动优化选项,或者在DCC软件中手动调整简化级别。 另外,拓扑错误也是可能的原因。引用[2]提到错误的拓扑结构可能导致问题,建议使用二分法筛选错误数据并进行拓扑矫正。用户可以使用MeshLab或Blender的网格分析工具检查模型是否存在非流形边、孤立顶点等问题,修复后再导出。 然后,考虑UE导入设置。在UE中,导入FBX或OBJ时,检查是否启用了自动生成碰撞或LOD,这些功能可能修改原始网格。建议在导入时关闭这些选项,确保导入的网格是原始数据。此外,调整导入的细节级别,避免UE自动优化模型。 最后,如果问题依旧,可以尝试重新导出为其他格式如OBJ或FBX,并在导出前应用三角化修改器。例如,在Blender中选择网格->清理->三角化面,确保所有面都是三角面后再导出。 总结步骤:检查导出设置、修复拓扑错误、调整UE导入设置、重新导出并三角化。这些方法应能解决大部分三角面缺失的问题。如果问题持续,可能需要进一步检查模型数据或咨询UE社区。</think>在Unreal Engine(UE)中导入模型时遇到缺少三角面的问题,通常与模型导出设置、拓扑结构或引擎处理流程有关。以下是分步解决方案: --- ### 1. **检查原始模型的三角面完整性** - **确认导出设置**:在3D建模软件(如Blender、Maya、3ds Max)中导出模型时,需确保勾选“导出三角面”或“Triangulate Faces”选项。例如,FBX格式导出时需在设置中启用三角化: ```python # 示例:Blender导出FBX时勾选
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值