unity中保持层级关系不变怎么取消父子物体之间的联系

RT
实现功能:
让角色旋转与光效的旋转分离开,光效始终处于角色下方,且他们的之间的旋转运动互不影响。

第1个回答  2014-08-21
子物体的变换默认使用的是局部坐标系,也就是相对与父级的变换。
那么你把子物体的Rotate函数用世界坐标系不就行了
Rotate (eulerAngles : Vector3, relativeTo : Space = Space.World)追问

想了很久,在计算机图形学中找到最佳的解决方案:先构建一个子物体想要旋转轴组成的坐标系,把子物体的position转换到该坐标系;然后在该坐标系下做旋转,并记录他的position;最后把该坐标转换回起始坐标系。其中涉及到的知识请看http://blog.csdn.net/cgcoder/article/details/8099185 ,希望后来者不再被这个问题困惑。

追答

没必要想得那么复杂,只要保证子物体的变换永远是相对于世界坐标系的就行了。
也就是说在父物体脚本中当父物体变换时,子物体的localeulerAngles和localeulerposition(当父物体绕非Y轴旋转时会用到)会做出相对的变换从而保持在世界坐标系中相对父物体的静止。(比如父物体按Y轴旋转每帧旋转1度,那么每帧子物体的localeulerAngles-=1)
然后通过子物体中独立的脚本来实现子物体的变换

追问

子物体相对父物体静止我做了transform.rotation = transform.parent.rotation * Quaternion.Inverse (transform.parent.rotation); 但是,麻烦出现了,子物体的变换始终是相对于父物体的本地坐标系的,也就是说,父物体的Y轴转动一个角度,它绕的是父物体的本地坐标系的Y轴,这样,子物体就不会处于水平旋转,

追答

    根据你需求子物体始终保持在父物体下方,那么在父物体脚本中始终定位在世界坐标系中子物体的position=父物体的position,区别只是y值。

     

    再来解决旋转问题,默认情况下子物体会随着父物体一起旋转,由于上面固定了子物体的position,所以这里无论父物体怎么旋转子物体的位置是不会变的,永远在父物体下方。这里只需要在父物体脚本中对子物体的旋转做父物体旋转的逆运算就可以保证子物体不会随父物体旋转发生改变。

本回答被提问者采纳
第2个回答  2014-08-20
在代码里面独立控制。除了这个方法我想也没有其他的吧。追问

怎么用代码控制,能给一点思路吗?

相似回答