关于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之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...
随机推荐
- Struts2漏洞分析,漏洞波及全系版本
Struts漏洞分析 Apache Struts团队已经发布了Struts 2.3.15.1安全更新版本.在Struts2.3.15.1版本之前,存在着严重的安全漏洞,如果现在一些比较大的网站是 ...
- UNIX网络编程读书笔记:原始套接口
概述 应用程序可以绕过传输层而直接使用IPv4和IPv6,这称为原始套接口(raw socket).http://www.cnblogs.com/nufangrensheng/p/3583435.ht ...
- itext处理pdf
http://www.java2s.com/Tutorial/Java/0419__PDF/DecryptPdffile.htm
- 通过micrometer实时监控线程池的各项指标
通过micrometer实时监控线程池的各项指标 前提 最近的一个项目中涉及到文件上传和下载,使用到JUC的线程池ThreadPoolExecutor,在生产环境中出现了某些时刻线程池满负载运作,由于 ...
- 加密PDF为只读模式
文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- Hadoop-1.2.1学习之Job创建和提交源码分析
在Hadoop中,MapReduce的Java作业通常由编写Mapper和Reducer開始.接着创建Job对象.然后使用该对象的set方法设置Mapper和Reducer以及诸如输入输出等參数,最后 ...
- 01-maven环境配置
一,下载maven.进入官网,点击downland,选择相应的版本下载. 2, 二,解压到相应目录下. 例如下载如下: 解压到该路径: 三,配置环境变量,新建一个maven_Home的变量,值为有bi ...
- 最全的iOS物理引擎demo
概述 最全的iOS物理引擎demo,实现重力.碰撞.推力.摆动.碰撞+重力.重力弹跳.仿摩拜单车贴纸效果.防iMessage滚动效果.防百度外卖首页重力感应等效果! 详细 代码下载:http://ww ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 理解三个SharePoint 部署模型 Apps
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 理解三个SharePoint 部署模型 Apps ...
- FFMPEG,将字幕“烧进”MP4视频中
原文地址:http://blog.csdn.net/ufocode/article/details/75475539 由于mp4容器,不像MKV等容器有自己的字幕流. MKV这种容器的视频格式中,会带 ...