Optimize Game Objects骨骼节点优化后SkinMesh以及动态骨骼

news2024/12/25 9:04:31

为了降低模型动画的性能开销,可以进行骨骼节点优化。

一、接口

unity官方提供了有两种方式可以进行节点优化:

注意当骨骼节点被优化后, Transform节点被剔除,因此需要将挂点等需要用到的节点暴露出来,即下面两个接口中的exposedTransNameList可以传入需要保留的节点路径。

1.在非运行时,直接对FBX文件进行操作 

 var importer = AssetImporter.GetAtPath(fbxPath) as ModelImporter;
       
 if (importer == null)
 {
     return;
 }
 importer.optimizeGameObjects = true;
 importer.extraExposedTransformPaths = exposedTransNameList.ToArray();
 importer.SaveAndReimport();

以下为FBX文件 保留的节点

2.运行时,隐藏/显示节点

AnimatorUtility.DeoptimizeTransformHierarchy(GameObject go);
AnimatorUtility.OptimizeTransformHierarchy(GameObject go, string[] exposedTransNameList)

骨骼节点优化后发生了什么?

不Optimized的prefab,这里的FileID对应的是Prefab内部的骨骼结点

m_Bones:
-{fileID: 4136033779980552}
-{fileID: 4068391989916132}
-{fileID: 4929649166801780}
-{fileID: 4756659351305440}
-{fileID: 4146386435630952}
-{fileID: 4992511966160680}
m_RootBone: {fileID: 4929649166801780}

  Optimized之后的prefab:

m_Bones: []
m_RootBone: {fileID: 0}

即SkinMeshRender中存储的根骨,有相应权重的骨骼节点列表都空了,那么蒙皮怎么生效呢?

二、原理

骨骼节点优化后,骨骼信息映射到了ConfigureAvatar空间内

注意预制体内的Animator组件下的avatar必须引用骨骼节点优化的FBX文件中的avatar,否则蒙皮不生效,游戏运行后,蒙皮不再根据原始骨骼节点的transform中的位置以及旋转变化,而是从avatar的映射空间获取(因此动态骨骼也不生效)

skinMeshRender组件引用的Mesh,包含骨骼、权重、索引等信息。但是没有骨骼的名称,只有名称的Hash值信息。在Optimized之后,Animator的hasTransformHierarchy为false,转发AnimationClip中对骨骼的控制至Mesh的蒙皮过程。

三、模型换装有两种方案

https://blog.csdn.net/f_957995490/article/details/108985716?ops_request_misc=&request_id=&biz_id=102&utm_term=%E9%AA%A8%E9%AA%BC%E8%8A%82%E7%82%B9%E4%BC%98%E5%8C%96%E5%90%8E%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0skinMeshRender&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-108985716.nonecase&spm=1018.2226.3001.4187

1.修改skinMeshRender中的Mesh以及材质球,需要保证骨骼和mesh不拆分;

2.骨骼mesh拆分,游戏运行后加载mesh预制体,然后根据skinMeshRender中记录的骨骼节点重新进行绑定。

若采用第二种方案,在进行骨骼节点优化后,因为骨骼节点都被剔除,因此无法绑定骨骼,会出现蒙皮不显示了,解决方案是保证skinMeshRender预制体加载路径和之前FBX文件内层级一致,之后重新激活Animator组件即可(暂未找到其他方法),确保animator中的avatar引用骨骼节点优化后的FBX文件内的avartar。

四、Optimize Game Objects与动态骨骼节点优化冲突

因为动态骨骼插件的原理是获取动态骨骼链上的所有节点transform,通过修改位置旋转,来影响蒙皮,但由于节点优化后,映射到了configure avatar 空间,因此即使保留了动骨节点,修改了transform,依然不生效。

动骨源码

 

 


 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高级篇】微服务保护

文章目录 微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链路2.…

<DB2>《DB2内存详细介绍》

《DB2内存详细介绍》 1 架构图2 主要概念2.1 内存集(Memory Set)2.2 内存池(Memory Pool)2.3 内存块(Memory Block) 3 内存方案3.1 第一级服务器内存3.2 第二级操作系统内存和实例共享内存3.3 第三级数据库…

K8S | 核心原理分析

整体上理解流程和原理; 一、背景 基于分布式的架构中,需要管理的服务是非常多的,无论是服务的数量还是体系划分; 从服务的能力上看,可以进行分层管控,只是其中有相当一部分服务层,改动更新的频…

【Python黑科技】自动答题项目代码分析(保姆级图文+实现代码)

目录 实现效果图片素材和源码 实现思路1. 打开对应网页,做好准备工作2. 获取正确答案3. 答题4. 提交试卷实现代码总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 图片素材和源码 已经…

chatgpt赋能python:Python如何在图像上标注

Python如何在图像上标注 对于图像标注,Python提供了许多工具和库,其中最常用的是OpenCV和Pillow。这篇文章将介绍如何使用Pillow在图像上进行标注。 安装Pillow库 在使用Pillow库之前,需要先安装它。在命令行中输入以下命令: …

2023-06-02 stonedb-修改包含内连接的嵌套外连接-问题反思

摘要: 最近在搞一个列存储引擎的包含内连接的嵌套外连接过慢的问题, 连接执行过慢的原因分析见此前的博客分析, 虽然逻辑很绕, 但是也不是无法分析. 更麻烦的问题在于修改查询计划, 让其能按照代价更小的方式正确的执行. 遇到的问题比我在修改查询计划前设想的更为棘手, 本文…

chatgpt赋能python:Python循环次数:实现高效编程的关键

Python循环次数:实现高效编程的关键 在编写Python程序时,循环次数是一个经常需要关注的问题。循环次数过多会导致程序执行效率低下,甚至可能引起性能问题。因此,如何控制循环次数成为实现高效编程的关键。本文将介绍Python中循环…

chatgpt赋能python:Python如何实现将数据结果导出

Python如何实现将数据结果导出 在Python编程中,我们经常需要将代码运行的结果导出保存在文件中,或在其他程序中使用。下面我们将介绍Python中几种将数据结果导出的方法。 方法一:使用文件输出 使用Python内置的open方法来打印输出的结果到…

【C++】类和对象 - 对象特性 - 构造函数和析构函数,函数分类及调用,拷贝构造函数调用时机,构造函数调用规则,深浅拷贝,初始化列表,类对象作为类成员

No.Contents1【C】基础知识 - HelloWorld,注释,变量,常量,关键字,标识符2【C】数据类型 - 整型,sizeof,实型,字符型,转义字符,字符串类型,布尔类型…

chatgpt赋能python:Python版本更新:为什么你应该及时升级

Python版本更新:为什么你应该及时升级 作为一名有10年Python编程经验的工程师,我深刻理解Python版本更新的重要性。在这篇文章中,我将向你介绍Python版本更新的背景和原因,并告诉你如何及时升级Python的版本以保持你的代码的安全…

由 Direct buffer memory 引发的附件下载优化方案

文章目录 前言一、Direct buffer memory1.1 原因分析1.2 解决方案 二、附件下载2.1 问题分析2.2 解决方案2.2.1 本地下载2.2.1 minio下载 前言 本地上传大文件内存溢出 Direct buffer memory附件下载服务端传流给前端需要将流缓存完毕才可以下载,导致大文件下载系统…

浏览器的渲染原理

网页的解析过程 ◼ 常见的浏览器内核有  Trident ( 三叉戟):IE、360安全浏览器、搜狗高速浏览器、百度浏览器、UC浏览器;  Gecko( 壁虎) :Mozilla Firefox;  Presto&#xff…

chatgpt赋能python:Python散点图连接成光滑曲线的技巧

Python散点图连接成光滑曲线的技巧 Python是一种功能强大的编程语言,广泛用于数据科学、机器学习、Web开发和自动化等领域。在数据可视化中,散点图是一种非常重要的图表类型,用于显示两个变量之间的关系。然而,有时散点图可能过于…

Linux 可视化管理-webmin 和 bt 运维工具

Linux 可视化管理-webmin 和bt 运维工具 webmin 基本介绍 Webmin 是功能强大的基于Web 的Unix/linux 系统管理工具。管理员通过浏览器访问Webmin 的各种管理功能并完成相应的管理操作。除了各版本的linux 以外还可用于:AIX、HPUX、Solaris、Unixware、Irix 和Fre…

freeRTOS学习(四)

队列管理 队列提供了任务到任务、任务到中断和中断到任务的通信机制。 队列的特征 数据存储 队列可以保存有限数量的固定大小的数据项。一个队列所能容纳的最大条目数称为它的长度。每个数据项的长度和大小都在创建队列时设置。 队列通常用作先进先出(FIFO&…

【利用AI让知识体系化】常见的移动端适配知识

I. 引言 A. 移动设备的普及度 移动设备的普及度近年来持续攀升,据统计,截至2021年,全球手机用户数量已达51.98亿,而智能手机的普及率则已经超过了70%,成为人们生活中最为重要和常用的工具之一。 同时,平…

chatgpt赋能python:Python如何更改?

Python如何更改? 如果您想成为一名成功的Python程序员,那么您需要知道如何更改Python代码。在这篇文章中,我们将介绍Python如何更改,并提供一些实用的技巧和建议来使您的编码更加高效和有用。 什么是Python? Python…

chatgpt赋能python:Python如何填充颜色

Python如何填充颜色 Python是一种简单易学但功能丰富的编程语言,被广泛用于各种开发领域。其中填充颜色是Python中的一个非常重要的功能,在很多项目中都会经常用到。本文将介绍Python如何填充颜色,让你快速上手。 什么是填充颜色 填充颜色…

Python matplotlib库的使用

目录 画图的两种基本方式: 隐藏边框: 隐藏坐标系 设置网格线 共享坐标轴 双坐标轴 设置坐标轴标签及刻度字体大小 设置坐标轴标签据离坐标轴距离 画点与线 标注文字 画不同大小的多个坐标系 调节子图间距 导入库: import matplotl…

【JavaSE】Java(五十):核心要点

文章目录 1. JDK 和 JRE 有什么区别2. \和 equals 的区别3. final 在java中有什么作用4. Java中的Math() 类有哪些常用方法5. String 属于基础数据类型吗? 1. JDK 和 JRE 有什么区别 JDK(Java Development Kit)和 JRE(Java Runtime Environ…