关于Unity中的transform组件(二)
在Scene视图中的蓝色网格,每一格默认是1米
一、沿着Z轴每秒移动10米
Transform cube_trans;
void start(){
this.cube_trans=this.transform.Find("cube");
}
void upate(){
float s=10*Time.deltaTime;//每次移动的距离=速度*移动一次的时间间隔,距离是标量
this.cube_trans.position=this.cube_trans.position+this.cube_trans.forward*s;//forward是单位向量,这里单位向量*变量表示在这个方向移动的距离,单位向量*变量得到的是这个标量在这个单位向量上的x,y,z的分解。
}
二、局部坐标和世界坐标的转换(世界坐标系就是scene视图的右上角那个坐标系)
在unity编辑器中,默认是设置局部坐标,除了一些根节点的局部坐标和世界坐标一样的情况,如Main Camera,Directional Light,game_root等节点。
在代码编辑器中,默认是世界坐标,即不管是父节点还是子节点,使用 this.transform.position得到的坐标,都是世界坐标。硬要获得局部坐标可以用this.transform.localPosition。
1.将局部坐标转成世界坐标
方法a:Vector3 w_pos = this.transform.TransformPoint(new Vector3(0, 0, 0));//其中new Vector3(0, 0, 0)是相对于当前脚本所挂载节点的三维局部坐标,w_pos则是世界坐标。
Debug.Log(w_pos );//原先设置的this.transform.gameObject这个根节点的世界坐标为(0,0,10),所以这里的输出结果应该是(0,0,10)。
方法b:Vector3 w_pos = this.transform.TransformVector(0, 0, 0);//其中(0, 0, 0)是相对于当前脚本所挂载节点的三维局部坐标,w_pos则是世界坐标。
Debug.Log(w_pos );//原先设置的this.transform.gameObject这个根节点的世界坐标为(0,0,10),所以这里的输出结果应该是(0,0,10)。
2.将世界坐标转成局部坐标
Vector3 local_wpos = this.transform.InverseTransformPoint(new Vector3(0, 0, 15));//其中new Vector3(0, 0, 15)是三维世界坐标,local_wpos 则是局部坐标。
Debug.Log(local_wpos);//原先设置的this.transform.gameObject这个根节点的世界坐标为(0,0,10),所以这里的输出结果应该是(0,0,5)。
3.物体的局部坐标的方向(物体自身的方向)
transform.forward、 transform.right、 transform.up
4.物体的世界坐标的方向
Vector3.forward、 Vector3.right、 Vector3.up
三、平移,缩放
1.Space.Self和Space.World
点击一个节点,按住ALT+鼠标左键进行旋转节点,或者平移节点等操作,这个操作的范围就是在这个节点自己的的坐标系中,名字叫Space.Self
如果让一个节点绕另一个节点旋转,像地球绕太阳那样旋转,那么这个操作的范围就是在世界坐标系中,名字叫Space.World
2.平移
void upate(){
float s=10*Time.deltaTime;//每次移动的距离=速度*移动一次的时间间隔,距离是标量
//情况a
this.cube_trans.Translate(new Vector3(0,0,s));//如果没有制定坐标系,那么x,y,z就是自己节点模型的坐标系Space.Self,这时候会往节点的z轴的方向移动。
//情况b
this.cube_trans.Translate(new Vector3(0,0,s),Space.World);//如果指定了坐标系,那么就按照指定的坐标系的方向进行运动,比如这里就是按照世界坐标系的z轴方向移动。
//情况c
this.cube_trans.Translate(new Vector3(0,0,s),this.transform);//这时候设置了以某个节点的坐标系为参考系,以参考系的方向为平移方向,这里是把,this.transform也就是game_root这个根节点作为参考系,所以game_root节点的z轴在哪个方向上, cube就往哪个方向平移。
}
3.缩放
//情况a
Debug.Log(this.cube_trans.localScale);//当前节点的缩放系数,不考虑父节点的影响,也就是在Unity编辑器上节点的的scale值,是一个三维的数。
//localScale是可读可写的,从F12看函数定义可以看出,localScale有get和set访问器。
//情况b
Debug.Log(this.cube_trans.lossyScale);// 如果所有的父亲又缩放,那么这个比例系数,也会影响到孩子。整个这个对象在全局的缩放系数,结果是(父节点的x缩放系数*子节点的x缩放系数,父节点的y缩放系数*子节点的y缩放系数,父节点的z缩放系数*子节点的z缩放系数)。
//lossyScale是只能读的,从F12看函数定义可以看出,lossyScale只有get访问器。
四、旋转
相比平移和缩放,比较复杂。
如果用数学矩阵表示任意的旋转,虽然是可行的,但是每个矩阵需要16个数,很消耗内存。其实旋转只要旋转方向向量(x,y,z)旋转角度4个数就可以了,没必要用到16个数。
1.使用欧拉角表示:
一个节点先绕自身x轴旋转一定角度,再绕自身y轴旋转一定角度,最后绕自身z轴旋转一定角度,最后的结果构成欧拉角。
不同的轴旋转顺序,会得到不同的结果。Unity规定是按照zxy的旋转顺序来决定欧拉角的,不管我们怎么填旋转角度都是用那个顺序绘制的。
所以Unity的inspector视图上的
Rotaton x 12 y 24 z 48表示,先绕z轴旋转48度,再绕x轴旋转12度,最后绕y轴旋转24度。
缺点:会造成万向节锁的现象。
2.使用四元数Quaternion表示:
节点在一个方向旋转多少角度
Debug.Log(this.cube_trans.rotation);
优点:
(1)可以避免万向节锁现象;
(2)只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高
(3)可以提供平滑插值;
缺点:
比欧拉旋转稍微复杂了一点点,因为多了一个维度。
3.四元数和欧拉角互相转换
欧拉角和四元数可以相互转换。Unity的编辑器使用的是欧拉角,代码编译器使用的是四元数,所以打印出来的Unity编辑器和代码中的x,y,z的值会不一样。
// unity transform里面为了避免万象节锁,使用的是四元数来存放一个旋转;
// unity编辑器里面为了直观的来旋转,使用的是欧拉角来表示
(1)四元数转欧拉角
Vector3 e_degree = this.cube_trans.rotation.eulerAngles;//e_degree是欧拉角,this.cube_trans.rotation是四元数
Debug.Log(e_degree);
虽然转换出来的e_degree和Unity编辑器上Inspector面板上的Rotation的值还是有一些区别,主要是因为四舍五入和一些运算造成的差值,这些差值基本没影响。
(2)欧拉角转四元数
//绕y周旋转45;
// this.cube_trans.rotation = Quaternion.Euler(new Vector3(0, 45, 0));//里面的new Vector3(0, 45, 0)是欧拉角,this.cube_trans.rotation是四元数
(3)使用欧拉角做旋转操作
// 欧拉角旋转, 在当前的基础,再绕y周旋转45;
this.cube_trans.Rotate(new Vector3(0, 45, 0));
(4)使用四元数做旋转叠加
void update(){
float w = 360;
float degree = w * Time.deltaTime;
// this.cube_trans.Rotate(0, degree, 0);//这个语句是每一帧旋转360度,这个貌似是用欧拉角旋转的。
this.cube_trans.rotation = this.cube_trans.rotation * Quaternion.Euler(new Vector3(0, degree, 0));//把每个小变换组成一个大的总的变换,那么是用 * 和矩阵类似,这个是用四元数的叠加的。
}
关于Unity中的transform组件(二)的更多相关文章
- 关于Unity中的transform组件(一)
一.transform组件用途 1.维护场景树 2.对3D物体的平移,缩放,旋转 二.场景树定义 在Hierarchy视图中显示的: 一个game_scene场景,下面有Main Camera节点,D ...
- 关于Unity中的transform组件(三)
game_root节点下右一个Cube子节点,和一个Sphere节点,脚本挂载在game_root下 四元数:(1)Quaternion rot (2)this.cube.rotation 欧拉角:V ...
- unity中Event Trigger组件应用代码
using UnityEngine; using System.Collections; using UnityEngine.Events; using UnityEngine.EventSystem ...
- 关于Unity中关节的使用(二)
导入 1.创建工程 2.导入joint_scene.unitypackage 3.运行发现机械爪子摇来摇去,因为line节点下面的子节点之间相互碰撞带动的关系 4.为了消除这种乱摇,我们在右上角添加一 ...
- Unity中的Transform Gizmo中的Pivot和Center
选择中心(Center)意味着使用当前所选所有物体的共同轴心, 选择轴心(Pivot)意味着将使用各个物体的实际轴心 区别在于是否选中了多个物体或者有层级关系的物体. 第一张图是Center,中心在组 ...
- unity中遍历Transform的子物体
1.遍历Transform直接子transform private void Start() { var Equipment = building.transform.FindChild(" ...
- Unity UGUI——Rect Transform组件(基础属性)
基础属性:Width.Height.Pivot图示 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXJfQUhhbw==/font/5a6L5L2T/fo ...
- Unity基础知识学习笔记二
1,object Instantiate(object original,Vector3 position,Quaternion rotation) 克隆原始物体,并返回克隆物体. ...
- Unity编程标准导引-Unity中的基本概念-2.1界面概览
Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...
随机推荐
- VMware - "Determining IP Information for eth0...Failed
Linux ifup eth0 出现错误: Dertermining IP information for eth0....failed - no link present check cable D ...
- SVN 快速入门!
输入账户密码即可!
- 在Ubuntu 12 服务器上源码安装 OpenERP 8.0
原文:http://vivianyw.blog.163.com/blog/static/134547422201421112349489/ 1. 安装SSH: sudo apt-get install ...
- linux(Centos)下编译安装gcc4.8.2
欢迎转载.转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46811159 近期要用到c++ 11,所以没办法仅仅得把那台ce ...
- Ubuntu 12.04 LTS 下配置 apache支持SPDY, 使用wireshark 抓包分析SPDY 协议
1.安装apache sudo apt-get install apache2 root@ubuntu:/etc/apache2/mods-enabled# apache2 -v Server ver ...
- spring spel表达式语言
一.通过bean的id对bean进行引用 1.对其他bean的引用 <property name="dept" value="#{dept}"/> ...
- Tomcat 关闭时报错
最近tomcat走普通的关闭方式无法正常关闭,会报一些Error,用的是Tomcat7,据说是Tomcat7在关闭的时候加了一些检查线程泄漏内存泄露的东西 总结起来,在我项目中有这么几个原因会导致关闭 ...
- Oracle 角色、权限
Oracle 角色管理 一.何为角色 角色:角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限.二.系统预定义角色 预定义角色是在数据库安装后,系统自动创建的一些常 ...
- 分享阿里云SLB-负载均衡的实现基本原理架构
负载均衡技术原理浅析 https://help.aliyun.com/knowledge_detail/39444.html?spm=5176.7839438.2.6.XBbX5l 阿里定制版的LVC ...
- DBMS_SQL使用
一.简介 DBMS_SQL包提供一个接口,用于执行动态SQL(包括DDL 和DML). DBMS_SQL定义了一个实体叫游标ID,游标ID是一个PL/SQL整型数,通过游标ID,可以对游标进行操作. ...