当前位置: 首页 > 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.lryc.cn/news/501306.html

相关文章:

  • Java版企业电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
  • 通过源码⼀步⼀步分析 ArrayList 扩容机制
  • 源码分析之Openlayers中默认Controls控件渲染原理
  • 中间件的分类与实践:从消息到缓存
  • 京东e卡 h5st 4.96
  • 《CSS 知识点》滚动条仅在 hover 时才显示(宽度不改变)
  • 手里有病理切片+单细胞测序的数据,如何开展医工交叉的研究?
  • 力矩扭矩传感器介绍
  • 【Appium】AttributeError: ‘NoneType‘ object has no attribute ‘to_capabilities‘
  • QT 中 多线程(备查)
  • 第八十六条:在实现serializable接口时要特别谨慎
  • 【Elasticsearch 中间件】Elasticsearch 客户端使用案例
  • 深入理解MySQL中的ONLY_FULL_GROUP_BY
  • 获得日志记录之外的新视角:应用程序性能监控简介(APM)
  • 如何避免缓存击穿?超融合常驻缓存和多存储池方案对比
  • 口语笔记——祈使句用法
  • SQL连续登录问题(详细案例分析)
  • Next.js 系统性教学:深入理解缓存与数据优化策略
  • 【PyTorch】(基础六)---- 搭建卷积神经网络
  • 【JAVA项目】基于ssm的【美食推荐管理系统】
  • adb 常用命令笔记
  • [代码随想录Day32打卡] 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
  • android NumberPicker隐藏分割线或修改颜色
  • 7-2 二分查找
  • mid360使用cartorapher进行3d建图导航
  • Ubuntu安装grafana
  • Java版-图论-最短路-Floyd算法
  • 可视化建模以及UML期末复习篇----UML图
  • HTML常见标签列表,涵盖了多种用途的标签。
  • FPGA 16 ,Verilog中的位宽:深入理解与应用