TransformDirection()菜鸟自己总结最容易理解

一、

现在有一个cube,pos和rotation都是(0,0,0),三个轴代表世界的三个轴,粗的那边为正方向。

222

对于cube自己的本地坐标系来说,cube==世界,cube==世界,cube==世界。也就是和世界坐标系(世界空间)重合。(Unity的轴为cube身上的local轴)

二、

print(transform.TransformDirection(Vector3.forward));

(代码挂在cube上,cube.transform就是transform)

这句代码含义是:打印( cube的(0,0,1)这个向量相当于世界的哪个向量 ) ;

代码输出为:(0,0,1)

解释:cube自己坐标系的前方(0,0,1),相当于世界坐标系的哪个方向?因为现在是重合,所以cube的前方就是世界的前方,所以输出还是(0,0,1)。(Vector3.forward这里指的仅仅只是(0,0,1)而已,并不是世界坐标的前方。)

transform.Translate(transform.TransformDirection(Vector3.forward));

这段代码Translate()括号里的内容就是第一段代码,所以可以理解为Translate(0,0,1)。那么cube.Translate(0,0,1)是朝哪移动呢?肯定是顺着Z轴正方向(Z+)移动。

三、

现在cube在军训,教官叫他“向右转”(Y转90°):

现在pos为(0,0,0),rotation为(0,90,0)

222

现在本地坐标和世界坐标不再重合了。从图222可看出,cube==世界,cube==世界,cube==世界

再来看这两段代码:

print(transform.TransformDirection(Vector3.forward));

现在输出为:(1,0,0)

代码含义不变:打印( cube的(0,0,1)这个向量相当于世界的哪个向量 ) ;现在的cube前相当于世界右,所以是(1,0,0)。

transform.Translate(transform.TransformDirection(Vector3.forward));

现在这段代码等于transform.Translate(1,0,0); 也就是cube向自己的右边平移,上面说cube的右==世界的后,所以,没错,cube朝着世界坐标的后移动(Z-)。

四、

再来一组试试,cube的x转90,y转90。现在pos为(0,0,0),rotation为(90,90,0),且代码中TransformDirection(xxx)的参数改为Vector3.right。

333

从图333可看出,cube==世界,cube==世界,cube==世界

print(transform.TransformDirection(Vector3.right));

输出:(0,0,-1),因为看图333,cube的右==世界后。

transform.Translate(transform.TransformDirection(Vector3.right));

代码等于transform.Translate(0,0,-1),也就是cube向后移动,还是看图333,cube的后就是世界的上,所以cube朝上飞

总结、

  • 所以TransformDirection(Vector3 dir),可以简单理解为:一个物体自己坐标系的dir方向,相当于世界的什么方向。
  • 这个方法必须是某个游戏物体的transform才能“点”出来,也就是用这个“点”出方法的物体自己的坐标系去转换世界的坐标系。
  • TransformDirection()方法不受position和scale影响。
  • 返回的矢量有长度,长度就是参数dir的长度。
  • 若dir表示位置而不是方向,则应该使用TransformPoint()转换。
  • 还有一个InverseTransformDirection(),可以简单理解为TransformDirection()的镜像反转。
  • 以上的例子不限于刚好转90°的情况,任何角度都可以算出。
  • 有没有发现,这种方法拐弯怪得比Translate(直接写参数)“急”一点,由“三”可以看出,cube仅仅在Y上转了90°,整个方向却调换了180°。
  • transform.forward/up/right这三个属性(不是Vector3的6个方向)内部其实相当于做了TransformDirection()转换。

猜你喜欢

转载自blog.csdn.net/weixin_44496853/article/details/126729103