关于Unity3D中lossyScale的一点思考

发表于2017-07-13
评论0 9.6k浏览

关于Unity3DlossyScale的一点思考

 

Unity3D中,transformlossyScale这个属性使用情况并不多,因此很多人对其没什么了解,笔者最近在做和Unity3D有关的服务器工作,需要了解其来源,因此对其做了一点研究。

Unity3D的官方文档里,是这样介绍lossyScale的:

然而,这样的介绍,对实现该属性并无多大意义,当然,为什么要实现该属性,因为Unity3D中的基本碰撞体是使用lossyScale伸缩的,以保证基本碰撞体不变形,如下图所示:

BoxRenderMesh已经变形成平行四面体,但BoxCollider仍然是长方体,至于为什么BoxCollider不能变形成平行四面体,是受制于其物理引擎PhysicX未提供平行四面体。

该限制只限于基本碰撞体,对于MeshCollider(无论是否是凸包)则不存在这一限制,如下图所示:

 

好了,扯了这么多,无非是想说lossyScale还是有点用的,计算该值是有必要的,那么如何通过层级TransformlocalPosition, localRotationlocalScale来计算lossyScale呢?

回到基本的矩阵变换,我们有:

如果知道M, TR,我们就能得到代表伸缩的S矩阵:

伸缩矩阵SlossyScale到底有什么关系呢,通过实验发现lossyScale是伸缩矩阵对角线元素,我们构建了一个两层的GameObject

随便设置下GameObjectCubetransform

 

计算lossyScale并对比的代码如下图所示:

结果如下图所示:

很明显的可以看到,lossyScale就是变换矩阵MS矩阵的对角线元素。

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: