找回密码
 立即注册
查看: 805|回复: 0

Unity C#基础 - Transform 缩放

[复制链接]
发表于 2024-8-2 09:50 | 显示全部楼层 |阅读模式
2022.9
为什么只有localScale,没有worldScale?lossyScale又是什么?

If you have a rotated object as the child of a scaled objet, the child object can be skewed.
上图:CubeA无父物体;CubeB有父物体,且CubeB相对父物体有旋转;此刻对CubeB的父物体进行缩放,会发现——CubeB的6个面被挤压为平行四边形,不再是矩形了,你永远不成能让CubeA通过xyz缩放变得和CubeB一样。
scale的本质是一个3x3的变换矩阵,只有当我们明确规定scale是沿模型空间的x轴、y轴和z轴进行缩放时,我们才可以用一个Vector3来便利地暗示scale


scale需要先指定缩放轴,再指定缩放值。
一般我们默认用模型空间的x轴、y轴和z轴作为缩放轴,并以一个Vector3来记录模型的缩放值,
unity把它记为【transform.localScale】,我感觉这个“local”有2层含义——

  • 这个Vector3直接显示在物体的Transform组件里,就像localPosition一样;
  • 缩放是沿local space的坐标轴进行的;
此刻请问,当你提出“worldScale”这个词的时候,这个词具体指的是什么?是沿world space的坐标轴进行的缩放?还是物体因父物体缩放而发生的整体缩放?——为避免混淆,我们使用overallScale(先假设它是Vector3)来指代整体缩放,而且【物体的overallScale的缩放轴】与【其localScale的缩放轴】一致。
假设此刻有一物体B和它的父物体P,

  • 如果物体B相对父物体的旋转为0,那么【物体B的localScale的缩放轴】和【物体P的localScale的缩放轴】一致,这两个localScale按位相乘得到的Vector3,即物体B的overallScale;
  • 如果物体B相对父物体的旋转为0,那么【物体B的localScale的缩放轴】和【物体P的localScale的缩放轴】一致,物体B会skew,我们无法用一个Vector3(overallScale)来暗示这种整体缩放,模型每个顶点都有各自分歧的缩放值;
unity提供了一个只读的属性(试图描述这种整体缩放):Transform.lossyScale
It is a convenience property that attempts to match the actual world scale as much as it can. If your objects are not skewed the value will be completely correct and most likely the value will not be very different if it contains skew too.

  • 如果物体B相对父物体的旋转为0,那么物体B的overallScale = B.transform.lossyScale;
  • 如果物体B相对父物体的旋转不为0,那么物体B的整体缩放无法用一个Vector3来描述;unity依然会计算 B.transform.lossyScale,但是这个数值没什么意义;


如上图:两个灰色方块,左边是CubeA(无父物体),右边是CubeB(有父物体,且CubeB相对父物体有旋转);通过脚本使CubeA跟随CubeB的lossyScale数值缩放;此刻改变CubeB父物体的scale数值,可发现CubeB的collider和CubeA始终一致——
可见物体的collider在缩放的时候使用的是lossyScale,以避免skew(box collider始终是box collider)
<hr/>我没查到unity是怎么计算lossyScale的,但是可以斗胆猜测一下:
物体B沿父物体P的localScale的缩放轴进行缩放,缩放大小记为parentScale=(s1,s2,s3)
Vector3 parentScale = P.transform.localScale;
求物体B的一个顶点沿物体B的local space的坐标轴进行缩放的大小:

  • 记物体B的一个顶点在其local space下的表达为向量u;
  • 设要求解的缩放值为localScaleU;
  • 记u在父物体P的local space下的表达为向量v;
  • 矩阵M左乘向量v,可以把向量v变换为向量u(从物体P的local space变换到物体B的local space);
    那么可求得:


在parentScale=(s1,s2,s3)和变换矩阵M都不变的条件下,物体B的每一个顶点的localScaleU都纷歧样,因此物体会skew;
记录了几组顶点缩放前后的位置变化,可以猜测,unity给出的lossyScale是按照每个顶点的缩放值(localScaleU)取平均得到的成果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-21 17:56 , Processed in 0.101168 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表