Optimize GameObject选项对骨骼Transform的影响

简介:

一、问题描述

相同的角色FBX,一个使用Optimize GameObject选项并暴露相应的骨骼,一个不使用,分别创建各自的Prefab,播放相同动画后,发现同一骨骼的朝向不一致(但位置是一致的)。


二、问题复现

我们使用研发团队提供的Package中的模型,复现了该问题。播放相同动画时,sk_palm_I的朝向如下图:

请输入图片描述
左:使用 Optimize, 右:不使用 Optimize


三、问题分析

我们首先进行一系列实验,试图从例子中发现一些有用的线索。

  1. 我们将更多的骨骼暴露出来,来看是否所有的骨骼朝向都不相同。结果发现,朝向不同的骨骼只是个例,进而发现sk_palm_I这根骨骼不存在对应的动画曲线,并且没有蒙皮对应的顶点。暴露其他没有动画曲线和蒙皮顶点的骨骼,发现骨骼朝向也不相同。

  2. 再来对比骨骼的朝向,发现不开启Optimize选项的sk_palm_l的transform.rotation(相对父骨骼)保持不变,手动将其设为(0,0,0)后朝向与开启Optimize选项的sk_palm_l朝向一致。因此,我们推测Optimize选项后无动画的骨骼的Rotation被归零,在其他无动画的骨骼上得到验证。

  3. 发现朝向不一致问题的角色使用了Humanoid模式,将其切换至Generic模式观察骨骼朝向。然后发现,在Generic模式下,不管骨骼有无动画曲线,其开启Optimize前后的朝向都是一致的。这说明朝向不一致问题只出现在Humanoid模式下。

通过这些实验,可以得出骨骼朝向不一致的条件:Humanoid模式,骨骼没有对应的动画曲线和蒙皮顶点。而开启Optimize后的朝向是开启前对应骨骼的Rotation归零后的朝向。

参阅 Unity关于Humanoid 以及 Optimize选项的相关描述:
Humanoid会将骨架(Skeleton)信息映射到另一个空间(通过Configure Avatar)。开启Optimize选项后,Unity更新骨骼矩阵时将不再考虑场景中骨骼Transform,而是直接使用Internal Skeleton。

综合上述这些信息,我们推测Humanoid的映射过程中骨骼Transform信息发生了变化。骨架映射可以在Configure Avatar中设置。下图验证了我们的想法:
请输入图片描述

在映射时,sk_palm_I的Rotation已经归零。

发现了问题原因,解决方法就很明了,在映射时修正Rotation信息。通过Pose->reset,所有骨骼的Transform就会与原始骨骼的Transform一致。然后再Enforce T,来进行映射。之后开启Optimize GameObject前后的骨骼朝向基本一致。


四、结论

Pose->Biped Pose(默认)会把所有不带动画、没有蒙皮顶点且不在Muscle中的骨骼的Rotation归零,所以对于类似该案例中的这类模型,映射时需要Reset。这个问题也验证了在开启Optimize GameObject之后,场景中的骨骼Transform信息不再影响到骨骼矩阵运算,也就省略了Mono到Native的信息传递,因此会使骨骼矩阵运算的速度得以提升。所以建议开发团队尽量地开启该选项。






原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
8月前
Shader显示模型外轮廓线
Shader显示模型外轮廓线
|
Java
JDK中字体的高度信息ascent/descent/leading是怎么计算的
JDK中字体的高度信息ascent/descent/leading是怎么计算的
105 0
字体结构的Baseline/Leading/Ascent/Descent的图示
字体结构的Baseline/Leading/Ascent/Descent的图示
114 0
字体结构的Baseline/Leading/Ascent/Descent的图示
|
UED
Google Earth Engine——WRI/GFW/FORMA/thresholds该数据集包含阈值,当越过该阈值时,会产生FORMA警报。
Google Earth Engine——WRI/GFW/FORMA/thresholds该数据集包含阈值,当越过该阈值时,会产生FORMA警报。
89 0
Google Earth Engine——WRI/GFW/FORMA/thresholds该数据集包含阈值,当越过该阈值时,会产生FORMA警报。
|
算法 ice
Google Earth Engine ——MYD10A1 V6 Snow Cover Daily Global 500m产品包含雪盖、雪反照率、雪盖分率和质量评估(QA)数据归一化差异积雪指数数据集
Google Earth Engine ——MYD10A1 V6 Snow Cover Daily Global 500m产品包含雪盖、雪反照率、雪盖分率和质量评估(QA)数据归一化差异积雪指数数据集
168 0
Google Earth Engine ——MYD10A1 V6 Snow Cover Daily Global 500m产品包含雪盖、雪反照率、雪盖分率和质量评估(QA)数据归一化差异积雪指数数据集
|
算法
Google Earth Engine ——MCD43A4 V6天底双向反射分布函数调整反射率(NBAR)这个产品结合了Terra和Aqua航天器的数据,从16天的时间里选择最好的代表像素。
Google Earth Engine ——MCD43A4 V6天底双向反射分布函数调整反射率(NBAR)这个产品结合了Terra和Aqua航天器的数据,从16天的时间里选择最好的代表像素。
673 0
Google Earth Engine ——MCD43A4 V6天底双向反射分布函数调整反射率(NBAR)这个产品结合了Terra和Aqua航天器的数据,从16天的时间里选择最好的代表像素。
|
数据挖掘
Google Earth Engine ——Landsat Vegetation Continuous Fields (VCF) 树木覆盖层包含高度超过 5 米的木本植被覆盖数据集
Google Earth Engine ——Landsat Vegetation Continuous Fields (VCF) 树木覆盖层包含高度超过 5 米的木本植被覆盖数据集
152 0
Google Earth Engine ——Landsat Vegetation Continuous Fields (VCF) 树木覆盖层包含高度超过 5 米的木本植被覆盖数据集
|
编解码 数据挖掘 Go
Google Earth Engine ——数据全解析专辑(Global SRTM CHILI (Continuous Heat-Insolation L)日照和地形阴影90m分辨率数据集
Google Earth Engine ——数据全解析专辑(Global SRTM CHILI (Continuous Heat-Insolation L)日照和地形阴影90m分辨率数据集
146 0
Google Earth Engine ——数据全解析专辑(Global SRTM CHILI (Continuous Heat-Insolation L)日照和地形阴影90m分辨率数据集
|
异构计算
glsl_optimizer(Shader自动优化器) 的使用
glsl_optimizer(Shader自动优化器) 的使用
510 0
glsl_optimizer(Shader自动优化器) 的使用