当前位置: 首页 > news >正文

UE4 骨骼网格体合并及规范

实现代码

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "SkeletalMeshMerge.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "AceMeshCombiner.generated.h"/*** */
UCLASS()
class ACEMESHCOMBINE_API UAceMeshCombiner : public UBlueprintFunctionLibrary
{GENERATED_BODY()public:UFUNCTION(BlueprintCallable, Category="AceMeshCombine")static USkeletalMesh* CombineSkelet(TArray<USkeletalMesh*> SourceMeshList, bool checkValid = false){if (checkValid){TArray<USkeletalMesh*> SrcList;//检查一下,防止mesh为空的情况出现for (auto item : SourceMeshList){if (item){SrcList.Add(item);}}return CombineSkeletNotCheck(SrcList);}else{return CombineSkeletNotCheck(SourceMeshList);}}UFUNCTION(BlueprintCallable, Category="AceMeshCombine")static USkeletalMesh* CombineSkeletNotCheck(TArray<USkeletalMesh*> SourceMeshList){//如果没有需要合并的mesh 返回空if (SourceMeshList.Num() == 0)return nullptr;//只有一个mesh直接返回源mesh即可if (SourceMeshList.Num() == 1)return SourceMeshList[0];if (SourceMeshList.Num() >= 2) //模型数量大于两个才合并{// 创建一个保存最终合成模型 CompositeMeshUSkeletalMesh* CompositeMesh = NewObject<USkeletalMesh>(GetTransientPackage(), NAME_None, RF_Transient);//数组第一项的骨骼作为新的骨骼,合并的所有mesh使用同一套骨骼CompositeMesh->SetSkeleton(SourceMeshList[0]->GetSkeleton());TArray<FSkelMeshMergeSectionMapping> InForceSectionMapping;// 创建引擎合并模型实例MeshMergeUtil,参考引擎源码类SkeletalMeshMerge,里面有具体实现逻辑FSkeletalMeshMerge MeshMergeUtil(CompositeMesh, SourceMeshList, InForceSectionMapping, 0);// 把SourceMeshList合并到CompositeMeshif (MeshMergeUtil.DoMerge()){return CompositeMesh;}}return nullptr;}
};

规范说明

1.合并网格体使用同一套骨骼

2.所有mesh基于骨骼Apose进行制作,确保关联性骨骼点与APose保持一致,否则合并后会导致动画位置不一致,非关联性骨骼点可自行定义初始位置,便于蒙皮(参照角色APose,TPose规范)

3.合并的目的是减少渲染数量,所以材质提前规划合并尽量使用同一材质,根据设计关联性合理分配材质共用性和贴图合并

4.LOD数尽量提前规划保持一致,合并后会以mesh列表中lod数最少的一个作为基准来生成LOD,如果某一个合并mesh没有制作LOD会导致列表中其他mesh的LOD失效,制作LOD的时间就白费了


http://www.mrgr.cn/news/79732.html

相关文章:

  • Representation + IL: Policy Contrastive Imitation Learning
  • 活动预告 |【Part1】Microsoft Azure 在线技术公开课:使用 Azure DevOps 和 GitHub 加速开发
  • Qt 中处理 QAction 信号与槽
  • 池化在深度学习中增强特征的作用
  • 验证码功能实现
  • 2024美赛数学建模C题:网球比赛中的动量,用马尔可夫链求解!详细分析
  • 【伪代码】数据结构-期末复习 线性表
  • 【git】git回退到之前版本+拓展git命令
  • TCP/IP杂记
  • 本地搭建MQTT服务器
  • Onedrive技巧与问题
  • v-for遍历多个el-popover;el-popover通过visible控制显隐;点击其他隐藏el-popover
  • 【实操GPT-SoVits】声音克隆模型图文版教程
  • Python爬虫之urllib库使用总结
  • Mac软件推荐
  • maxscript中BoundingBox求一个模型的高度
  • C#-WPF 常见类型转换方法(持续更新)
  • 5G Multi-TRP R16~R18演进历程
  • Linux网络基础知识————网络编程
  • rk3588-ubuntu22.04系统网关实现路由器功能:
  • 《Hadoop大数据技术应用综合训练》----以NBA冠军球队计数为例
  • C# .NET CORE 开发问题汇总
  • day10 电商系统后台API——接口测试(使用postman)
  • 【Spark】Spark Join类型及Join实现方式
  • 数据结构DAY1
  • 开发EDA工具常用的三方开源