解决Unity3D中多层级结构子物体旋转受父物体尺寸影响的问题

Posted 雁回晴空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决Unity3D中多层级结构子物体旋转受父物体尺寸影响的问题相关的知识,希望对你有一定的参考价值。

前言

       在使用unity3D进行场景设计和物体控制的过程中,多层物体嵌套是经常会用到的一个结构。多层级物体中,每个层次的物体可能都会有子物体,这就导致了子物体的一些行为会收到父物体参数的影响。本文讨论子物体旋转操作偶然会出现的mesh变形的问题。

问题描述

图1 正常操作展示

       图1(A)所示,我们设置了一个父物体(parent_cube)和一个子物体(child_cube),采用默认cube的Scale参数都是(1,1,1),父子物体要相距一定距离便于观察表现。此时的表现是正常的,即(1)当旋转父物体时候,子物体正常跟随转动并保持稳定结构关系,如图1(B)所示;(2)当旋转子物体时候,父物体静止而子物体可以正常旋转,如图1(C)所示。

图2 异常效果问题展示

       但是,当我们改变父物体的Scale参数数值,例如(1,0.2,1),且删除原来的子物体,并在和父物体同层级创建一个新的物体,不妨叫做“new_child_cube”,它的Scale参数采用默认设置即为(1,1,1)。接下来将新的子物体拖动到父物体之下,形成图2(A)所示的层级关系。此时,会发现子物体(new_child_cube)在被放到父物体下之后,它自己的scale变成了(1,5,1)。当旋转父物体时候,仍然正常,如图2(B)所示。但是当旋转子物体的时候,奇怪的Mesh形变就出现了,如图2(C)所示,这是咱们不想要看到的。这种现象对咱们设计多层物体并进行控制操作是不友好的。

解决方法

       要解决这种问题,首先要明确引发其产生的原因。通过上面的展示,我们能发现,当Scale的三个数值不相等的时候就会发生这种现象。但是如果父物体已经改变了Scale,子物体拖进去时候会自动重新适配Scale以保证其形状外观不变,而这种重新适配的Scale会导致其在自身发生旋转时出现Mesh变形。所以只要我们想办法保证每个层级的子物体都是采用自己的标准Scale,不受各级父物体的Scale变化影响,问题就自然解决了。 

图3 解决方法

       为了方便展示,我们改变一种组织多层次物体的结构。创建空物体,命名为parent_root,再创建另一个空物体,命名为child_root,它们的Scale均采用默认参数(1,1,1)。创建一个Cube作为父物体,命名为parent_cube,采用变形过的Scale数值(1,0.2,1),再创建一个Cube作为子物体,命名为child_cube,采用默认Scale参数(1,1,1)。拖动这些物体形成如图3(A)所示结构,父物体方块(parent_cube)和子物体方块(child_cube)分别挂在两个空物体节点(parent_root、child_root)之下。parent_cube和child_cube的position、rotation参数都设置为(0,0,0)。

       经过上述设置,我们实现了通过操作其父级挂载结点(空物体)来间接控制某一实际物体旋转的目的,同时物体的Scale参数的变化不会对更深层级的子物体产生影响,因为原本需要作为子物体的那些物体已经通过解耦设计解除了直接的控制关联,且保持了应有的等价控制效果。这样,图3(B)、图3(C)展示了现在的操作效果,实现通过控制挂载点来控制不同层级物体旋转。

结论

       本文介绍了一个Unity中比较常见的简单案例,虽然问题简单,能在比较关键的时刻帮助大家理清问题源头,快速定位问题从而解决问题。

 

 

以上是关于解决Unity3D中多层级结构子物体旋转受父物体尺寸影响的问题的主要内容,如果未能解决你的问题,请参考以下文章

解决Unity3D中多层级结构子物体旋转受父物体尺寸影响的问题

解决Unity3D中多层级结构子物体旋转受父物体尺寸影响的问题

Unity3d怎么获得孙物体相对于父物体的旋转坐标

unity3d 如何让子对象的顺序改变?

unity3d物体旋转

Unity3D 控制物体旋转详解 —— 自身绕轴旋转缓慢旋转鼠标控制旋转欧拉数和四元数的关系