Unity3d Transform.forward和Vector3.forward的区别!

在Unity中有两个forward,一个是Transform.forward一个是Vector3.forward。

对于Vector3来说,它只是缩写。没有其它任何含义。

  • Vector3.forward ,(0,0,1)的缩写。//在transform.Translate()中使用时,如果不表明坐标系,则为物体的局部坐标,即物体自身的正前方。
  • Vector3.right, (1,0,0)的缩写。
  • Vector3.up , (0,1,0)的缩写。

对于Transform.forward来说,它代表当前物体的物体坐标系的z轴在世界坐标系上的指向。(世界坐标系中的蓝色轴)。

如果使用Transform.Translate。需要注意Vector3和Transform是不同的。

1.Spcae.World

1transform.Translate(Vector3.forward * Time.deltaTime, Space.World); 2 3transform.Translate(transform.forward * Time.deltaTime, Space.World);

当局部坐标=世界坐标时。

当局部坐标!=世界坐标时。(旋转30度)

 

2.Spcae.Self

1transform.Translate(Vector3.forward * Time.deltaTime, Space.Self); 2 3transform.Translate(transform.forward * Time.deltaTime, Space.Self);

当局部坐标=世界坐标时。

当局部坐标!=世界坐标时。(旋转30度)

 

所以你会发现,当使用transform.Translate时参数是Space.Self。Transform.forward的移动方向会很奇怪。。

原因是transform.Translate参数Space.Self需要一个局部坐标系的方向向量,但是transform.forward是世界坐标的方向向量。

所以除非必要,否则别用这句代码:

transform.Translate(transform.forward * Time.deltaTime, Space.Self);

这会让你物体的前进方向变的混乱。

应该用:

1transform.Translate(transform.forward * Time.deltaTime, Space.World);//或者 2 3transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);

**小问题:**为什么旋转30°时,transform.Translate(transform.forward * Time.deltaTime, Space.Self);,这句代码会让物体往60°的方向移动呢?

首先transform.forward是自动对物体旋转值算出前进方向向量的变量。同时 **transform.forward是当前物体的物体坐标系的z轴在世界坐标系上的指向。**系统根据物理本身的局部坐标系计算出z轴在世界坐标系上的旋转值是30°,但是你使用transform.Translate并且设置了Space.Self按照局部坐标移动,那么,transform.forward这个30°的世界坐标的旋转又要根据物体的局部坐标系转化成局部坐标,那么两次30°+30°就是最后我们所看到物体往世界坐标的60°旋转方向移动。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )