在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组件(二)的更多相关文章

  1. 关于Unity中的transform组件(一)

    一.transform组件用途 1.维护场景树 2.对3D物体的平移,缩放,旋转 二.场景树定义 在Hierarchy视图中显示的: 一个game_scene场景,下面有Main Camera节点,D ...

  2. 关于Unity中的transform组件(三)

    game_root节点下右一个Cube子节点,和一个Sphere节点,脚本挂载在game_root下 四元数:(1)Quaternion rot (2)this.cube.rotation 欧拉角:V ...

  3. unity中Event Trigger组件应用代码

    using UnityEngine; using System.Collections; using UnityEngine.Events; using UnityEngine.EventSystem ...

  4. 关于Unity中关节的使用(二)

    导入 1.创建工程 2.导入joint_scene.unitypackage 3.运行发现机械爪子摇来摇去,因为line节点下面的子节点之间相互碰撞带动的关系 4.为了消除这种乱摇,我们在右上角添加一 ...

  5. Unity中的Transform Gizmo中的Pivot和Center

    选择中心(Center)意味着使用当前所选所有物体的共同轴心, 选择轴心(Pivot)意味着将使用各个物体的实际轴心 区别在于是否选中了多个物体或者有层级关系的物体. 第一张图是Center,中心在组 ...

  6. unity中遍历Transform的子物体

    1.遍历Transform直接子transform private void Start() { var Equipment = building.transform.FindChild(" ...

  7. Unity UGUI——Rect Transform组件(基础属性)

    基础属性:Width.Height.Pivot图示 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXJfQUhhbw==/font/5a6L5L2T/fo ...

  8. Unity基础知识学习笔记二

    1,object Instantiate(object original,Vector3 position,Quaternion rotation)       克隆原始物体,并返回克隆物体.     ...

  9. Unity编程标准导引-Unity中的基本概念-2.1界面概览

    Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...

随机推荐

  1. mysql表utf-8 字符串入库编码异常

    分析:http://www.myexception.cn/mysql/639943.html 解决方法:http://blog.sina.com.cn/s/blog_3f78232201011o26. ...

  2. Java泛型中extends和super的理解

    作者:zhang siege链接:https://www.zhihu.com/question/20400700/answer/91106397来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...

  3. 【Linux】cd命令

    用途 cd命令的主要作用是变换目录 全称 cd的全称是Change Directory   案例 以下是一些基础的cd命令操作(酒红色字体为命令 ,蓝色字体为解释字体) [root@bigdata ~ ...

  4. 用Drupal快速实现mobile平台服务端【转】

    原文地址:http://www.terrysco.com/node/drupal-as-mobile-backend.html 用Drupal很容易实现一个API,让手机平台或者其他系统使用json的 ...

  5. VS2012不能创建数据库连接出现或者连接数据库时提示:未能载入文件或程序集“Microsoft.SqlServer.Management.Sdk.Sfc, Version=10.0.0.0, C

    VS2012不能创建数据库连接时或者连接数据库时提示:未能载入文件或程序集"Microsoft.SqlServer.Management.Sdk.Sfc, Version=10.0.0.0, ...

  6. Git使用教程(全)

    Git是什么? Git是目前世界上最先进的开源的分布式版本控制系统(没有之一),用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开 ...

  7. LaTex 常见错误及解决办法

    出现错误: Multirow 要用库的  导入\usepackage{multirow} ,,即可

  8. 数据流图(DFD)画法

    数据流图(DFD)画法要求 一.数据流图(DFD) 1.数据流图的基本符号 数据流图由四种基本符号组成,见图5-4-1所示. 图5-4-1  数据流图的基本符号 例:图5-4-2是一个简单的数据流图, ...

  9. CodeMirror与jquery UI-Tabs混合使用 注意事项

    第一步:.将代码高亮渲染 第二步:jquery Tab输出: 第三步:点击Tab切换时,将代码块刷新: 参考:http://jtmorris.net/2013/06/codemirror-editor ...

  10. Ubuntu 16.04下搭建kubernetes集群环境

    简介 目前Kubernetes为Ubuntu提供的kube-up脚本,不支持15.10以及16.04这两个使用systemd作为init系统的版本. 这里详细介绍一下如何以非Docker方式在Ubun ...