四元数旋转问题
在Unity里,欧拉旋转的旋转顺序是Z、X、Y,这在相关的API文档中都有说明,例如Transform.Rotate。其实文档中说得不是非常详细,还有一个细节我们需要明白。如果你仔细想想,就会发现有一个非常重要的东西我们没有说明白,那就是旋转时使用的坐标系。给定一个旋转顺序(例如这里的Z、X、Y),以及它们对应的旋转角度(α,β,r),有两种坐标系可以选择:
1.绕坐标系E下的Z轴旋转α,绕坐标系E下的Y轴旋转β,绕坐标系E下的X轴旋转r,即进行一次旋转时不一起旋转当前坐标系;
2.绕坐标系E下的Z轴旋转α,绕坐标系E在绕Z轴旋转α后的新坐标系E'下的Y轴旋转β,绕坐标系E'在绕Y轴旋转β后的新坐标系E''下的X轴旋转r, 即在旋转时,把坐标系一起转动;
很容易知道,这两种选择的结果是不一样的。但如果把它们的旋转顺序颠倒一下,其实结果就会一样。说得明白点,在第一种情况下、按ZXY顺序旋转(世界坐标系旋转)和在第二种情况下、按YXZ顺序旋转是一样的(自身坐标系旋转)。证明方法可以看下这篇文章。而Unity文档中说明的旋转顺序指的是在第一种情况下的顺序。
transform.Roate 默认是自身坐标新,按照YXZ顺序旋转和一起旋转是一样的效果。
---------------------
作者:妈妈说女孩子要自立自强
来源:优快云
原文:https://blog.youkuaiyun.com/candycat1992/article/details/41254799
版权声明:本文为博主原创文章,转载请附上博文链接!
位移问题
transform.position+= 是按照世界坐标系进行的
transform.translate 默认的是自身坐标系
接下来我们讲一讲,Vector3.forward和transform.forward的区别,Vector3.forward的值永远是(0,0,1)(这里的(0,0,1)根据是Space.self还是world),而transform.forward我们可以理解为其对应物体的z轴方向,是一个向量,而不是一个坐标,但是我们应当把它看成世界坐标系内的,而不是局部坐标系内的。而transform的属性可以在我上面提到的对比来思考。是继承关系。
想要让物体向前移动,在transform.translate()上和直接修改transform.position上,差别是挺大的。
transform.position 本身就是世界坐标。
1、transform.position+= vector3.forward
等于是在世界坐标的z轴前进。
2、transform.position+=transform.forward
等于是物体自身坐标系的z轴前进。
3、transform.translate(vector3.forward,space.self)
等于是自身坐标系的z轴前进。
效果等同于2。
4、transform.translate(transform.forward,space.self)
这个用法会引起很怪异和鬼畜的后果,不建议使用。
5、transform.translate(vector3.forward,space.world)
等于是让物体沿着世界坐标的z轴前进。
效果等同于1。
6、transform.translate(transform.forward,space.world)
等于是让物体沿着“物体自身坐标z轴在世界坐标上的方向”前进(等同与物体沿着自身z轴前进)。
效果等同于2。
有些同学可能不太理解以上部分的含义,没关系,我们可以先记住,在后面自然就懂了。但我这里还是要讲一下。
对于translate(a,b)函数,如果省略b,系统将把它缺省为space.self,意思是在自身坐标系进行a向量方向的移动,如果b为space.world,那么物体就在世界坐标系上进行a向量方向的移动。还是不懂得话大家可以自己写一个小Demo试验一下,不要怕麻烦,学习从来没有捷径。
最后,总结一下,除了translate这种比较特殊的函数,其他的,比如SimpleMove,DrawLine等,如果要在游戏物体前方进行操作,一概使用transform.forward,但是要注意,他只是个模为1的向量,别忘了根据自己的需求灵活变化,这里需要大家自行体会!
参考:https://blog.youkuaiyun.com/kaluluosi111/article/details/17206655
https://blog.youkuaiyun.com/ithot/article/details/68485587
---------------------
作者:烟雨迷离半世殇
来源:优快云
原文:https://blog.youkuaiyun.com/qq_15020543/article/details/80777249
版权声明:本文为博主原创文章,转载请附上博文链接!
延时处理函数:
销毁的时候,可以用destroy(“”,延时时间),另外destroy还有一个立即销毁,永远删除的,destroyImmediate
延时invoke和invokerepeating。
另外还可以考虑协程。