获取UE4编辑器中材质和Mesh缩略图并拖拽到指定Mesh替换材质

任务一:获取材质或Mesh的缩略图并渲染成一张Texture2D图片

       我们知道在UMG中显示的图片和UE4编辑器中从磁盘Import进的图片最后都转成了Texture2D格式,然而缩略图的信息都是封装在以Thumbnail关键字的类中

做法:

      先拿到一个ObjectThumbnail,有多种方式获取,下面代码只是其中一种,还可以从ue4内存中拿,那种方式更快捷,然后从ObjectThumbnail中解压拿到ObjectThumbnail的Image的信息用TArray<unint8>保存,然后获取IImageWrapperModule模块,创建一个JPEG格式图片,并将TArray<unint8>的信息转成图片Color的TArray<unint8>信息,最后直接调用UKismetRenderingLibrary封装的静态函数直接创建一个Texture2D

UTexture2D* UMyButton::GetTexture2D(UObject* MeshObject)
{
	//UAssetManager& AssetManager = UAssetManager::Get();
	//FAssetData MeshObjectAssetData;
	//AssetManager.GetAssetDataForPath(MeshObject->GetPathName(), MeshObjectAssetData);


	//UAssetManager& AssetManager = UAssetManager::Get();
	//FAssetData MeshObjectAssetData;
	//AssetManager.GetAssetDataForPath(MeshObject->GetPathName(), MeshObjectAssetData);
	//UTexture2D* MyTexture2D = Cast<UTexture2D>(MeshObjectAssetData.GetAsset());
	
	int32 _imageRes = 128;
	FObjectThumbnail _objectThumnail;
	ThumbnailTools::RenderThumbnail(MeshObject, _imageRes, _imageRes, ThumbnailTools::EThumbnailTextureFlushMode::AlwaysFlush, NULL, &_objectThumnail);
	TArray<uint8> _myData = _objectThumnail.GetUncompressedImageData();

	TArray<FColor> _imageRawColor;
	for (int i = 0; i < _myData.Num(); i += 4)
	{
		_imageRawColor.Add(FColor(_myData[i + 2], _myData[i + 1], _myData[i], _myData[i + 3]));
	}
	//FString _fileName = OutputPath.ToString() + "/" + obj->GetName() + FString(".jpg");
	IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
	TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
	ImageWrapper->SetRaw(_imageRawColor.GetData(), _imageRawColor.GetAllocatedSize(), _imageRes, _imageRes, ERGBFormat::BGRA, 8);
	const TArray<uint8>& _ImageData = ImageWrapper->GetCompressed(100);
	UTexture2D*  MyTexture2D = UKismetRenderingLibrary::ImportBufferAsTexture2D(GetWorld(), _ImageData);
	return MyTexture2D;
}

注意的是,在自己测试时候发现UKismetRenderingLibrary::ImportBufferAsTexture2D在UE4.22版本提供了该函数,4.19版本没有封装该函数,大家可以自己追下源码自己封装个函数

 

任务二:在自定义的编辑器中实现材质拖拽给mesh并切换材质的功能

说下思路,将材质拖出来无非是创建一个窗口,在tick中跟随指针移动,只不过放到指针指着的mesh,这个mesh怎么获取,有多种方法:

比如通过射线碰撞检测实现的,以当前相机位置为原点,光标在屏幕上的2D位置转化成射线方向上的一个点,遍历查询该射线的碰撞网格,返回距离最近的即可

最后将材质替换到mesh上即可

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: UE4静态网格材质是指应用于静态网格体的材质。静态网格体是由顶点、多边形和顶点颜色构成的三维模型,静态网格材质负责定义这些三维模型的外观和表面属性。 UE4,可以通过将材质应用到静态网格体上,来改变其外观。静态网格材质可以包含各种着色属性,如颜色、纹理、法线贴图、金属度、粗糙度等。通过调整这些属性的数值或导入自定义图片,可以实现不同材质效果,如金属、木材、石头、草地等。 在UE4创建一个静态网格材质,首先需要在材质编辑器创建一个新的材质实例。然后,可以通过添加各种材质节点来定义不同的属性。例如,添加一个颜色节点可以调整模型的基础颜色,添加一个纹理节点可以贴上自定义的贴图来改变模型的表面纹理。 在应用材质到静态网格体时,可以通过在级别编辑器选择网格体并将创建的材质实例放到这个网格体上来实现。一个静态网格体可以应用多个材质,通过在编辑器选择其不同部分,可以分别给不同的部分应用不同的材质。 总之,UE4静态网格材质是用于定义静态网格体外观和表面属性的工具,通过调整不同属性的数值或导入自定义贴图,可以实现各种不同的材质效果。 ### 回答2: UE4的Static Mesh是指由顶点和面构成的静态模型。而材质是用来渲染物体表面的一种方式。在UE4,我们可以给Static Mesh添加材质来改变其表面的外观和质感。 首先,我们需要创建一个材质实例来设置Static Mesh材质。在UE4,我们可以使用材质编辑器来创建和编辑材质。在材质编辑器,我们可以添加各种节点来控制Static Mesh的纹理、颜色、高光、法线贴图等属性。 然后,将创建好的材质实例应用到Static Mesh上。可以通过选Static Mesh,在详细面板的材质选项选择已创建的材质实例。这样就可以将材质应用到Static Mesh上,并在场景进行预览。 另外,UE4还提供了一些可以控制Static Mesh材质的属性。比如,可以调整材质的透明度、金属度、粗糙度等参数,以达到更好的渲染效果。此外,还可以使用材质实例的参数来实现动态材质的效果,比如动态的纹理滚动、颜色变换等。 总之,UE4的Static Mesh材质功能非常强大。通过选择合适的材质实例并调整对应的属性,我们可以使Static Mesh在游戏呈现出各种不同的外观和效果,增强游戏的视觉效果和沉浸感。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值