Unity基础-Transform

任何游戏对象在创建的时候都会附带Transform组件,用于储存并操控物体的位置、旋转和缩放。

并且该组件是无法删除的。

Transform面板一共包含3个属性:

Position:位置

Rotation:旋转

Scale:(缩放)

可修改对象的位置、旋转方式、缩放数值

position;世界坐标系位置

localPosition;本地坐标系位置

缩放

localScale;自身缩放

lossyScale;全局缩放

旋转

transform.rotation;世界坐标系旋转

transform.localRotation;本地坐标系旋转

transform.eulerAngles;世界坐标系旋转

transform.localEulerAngles;本地坐标系旋转

欧拉角

构件在三维空间中的有限转动,可依次用三个相对转角表示这三个转角统称为欧拉角。

unity中的欧拉角有两种方式可以解释:

1,当认为顺序是yxz时(其实就是heading - pitch - bank),是传统的欧拉角变换,也就是以物体自己的坐标系为轴的。

2,当认为顺序是zxy时(roll - pitch - yaw),也是官方文档的顺序时,是以惯性坐标系为轴的。后者比较直观一些,但其实两者的实际效果是一样的,只是理解不一样。

欧拉角有两种:

静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。

动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。

使用动态欧拉角会出现万向锁现象;静态欧拉角不存在万向锁的问题

正常状态:三个独立的旋转轴

万向锁:一旦选择±90°作为pitch角,就会导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只能绕竖直轴旋转,丢失了一个表示维度。

万向节死锁会导致位置上连续变化,在数值表示上确是非连续的。给定的两个关键帧之间无法平滑过渡。解决方法:可以使用四元数球面线性插值

四元数

爱尔兰数学家William hamilton一直致力于寻找一种方法将复数2D扩展到3D他认为,新的复数应该有一个实部和两个虚部。但是一直没有成功。1843年,他在前往爱尔兰学院演讲的路上,突然意识到应该有三个虚部而不是两个。他把这种新复数类型性质刻在了桥上,这就是四元数。

四元数使用四个数来表达方位,因此命名为四元数用三个数来表达3D方位,一定会导致万向锁的问题。一个四元数包含一个标量分量和一个3D向量分量。通常标量分量为w,向量分量为v或者分开的x,y,z.

记法:[w,v][w,(x,y,z)]四元数与复数:复数定义: a+bi, i是所谓的虚数,满足 i的平方等于-1;a是实部,b是虚部。

四元数扩展了复数系统,使用了三个虚部i,j,k一个四元数[w,(x,y,z)]定义了复数 w+xi+yj+zk.很多标准复数的性质都能应用到四元数上。更重要的是,和复数来旋转2D中的向量类似,四元数也能用来旋转3D中的向量。

四元数是非常重要的工具类之一。在Unity中所有用到模型旋转的,其底层都是由四元数实现的,它可以精确的计算模型旋转的角度。Quaternion基于复数的表示并不容易被直观地理解,因此没有必要访问或修改单个Quaternion组件(x,y,z,w)只需通过Transform的rotation来实现旋转,或者构造新的旋转,如在两个旋转间平滑地插值

eulerAngles属性返回表示旋转的欧拉角度。表示旋转的角度,顺序依次绕z轴旋转euler.z度,绕x轴旋转euler.x度,绕y轴旋转euler.y度范例:创建一个旋转,绕y轴,指定一个30度旋转角

在unity3d中,用四元数来表示旋转,四元数英文名叫quaternion . 比如 transform.rotation 就是一个四元数,其由四个部分组成

Quaternion = (xi + yj + zk + w ) = (x,y,z,w)

quaternion 中 (x,y,z) 跟旋转轴有关, w 与绕旋转轴旋转的角度有关,因为它们都要经过代数运算才能得出旋转轴和旋转角度  


Unity3D 中 用quaternion 来对一个坐标点进行旋转,我进行的是第2种操作,即对一个向量进行旋转;

首先 ,Quaternion 的基本数学方程为 :

Q = cos (a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k(z * sin(a/2))    (a 为旋转角度)


Q.w = cos (angle / 2) 

Q.x = axis.x * sin (angle / 2) 

Q.y = axis.y * sin (angle / 2)  

Q.z = axis.z * sin (angle / 2)


我们只要有角度就可以给出四元数的四个部分值,例如我想要让点M=Vector3(o,p,q) 绕x轴顺时针旋转90度;那么对应的quaternion数值就应该为:

Q : Quaternion;

Q.x = 1 * sin(90度/2) = sin(45度) = 0.7071

Q.y = 0;

Q.z = 0;

Q.w = cos(90度/2) = cos (45度) = 0.7071

Q = (0.7071, 0 , 0 , 0.7071);

m = Q * m;(将点m 绕 x轴(1,0,0) 顺时针旋转了90度)

示例:

using UnityEngine;

using System.Collections;

class EulerAnglesTest: MonoBehaviour 

{

  public Quaternion rotation = Quaternion.identity;

  public void Awake() {   

     rotation.eulerAngles = new Vector3(0, 30, 0); 

    transform.rotation = rotation;

 }

}

Translate

移动transform在translation的方向和距离。

Space.Self和Space.World

注意,vector.forward和tranform.forward区别

Debug.Log("****************************");

Debug.Log(Vector3.forward);

Debug.Log(Vector3.right);

Debug.Log(Vector3.up);

Debug.Log("****************************");

Debug.Log(transform.forward);

Debug.Log(transform.right);

Debug.Log(transform.up);

Rotate

Transform.Rotate 旋转

Transform.RotateAround 围绕旋转

LookAt

盯着看

transform.LookAt(Transform target);

transform.LookAt(Vector3 worldPosition);

扩展

transform.LookAt(Transform target,Vector3 worldUp);

z轴指向目标后,y轴旋转变换指向由worldUp向量暗示的方向。 如果省略worldUp参数,该函数将使用世界y轴。 worldUp只是一个提示矢量。

Find:通过名字查找子物体并返回它。如果没有查找到子物体名字,将返回null。如果名字包含“/”字符它将向路径一样穿越层次。

GetChild():根据子节点的序列查找子物体。

Transform维护父子关系

Transform.root 根

Transform.parent 父级

Transform.childCount 子物体数

Transform.SetParent();设置父节点

Transform.DetachChildren 分离子物体

坐标系变换

TransformPoint:变换位置从物体坐标到世界坐标

InverseTransformPoint:变换位置从世界坐标到自身坐标

TransformDirection:将一个方向从局部坐标变换到世界坐标方向。

InverseTransformDirection:将一个方向从世界坐标变换到局部坐标方向。

(扩展)矩阵(Matrix)

一个标准的4x4变换矩阵。

一个变换矩阵可以执行任意的线形3D变换(例如,平移,旋转,缩放,切变等等)

并且透视变换使用齐次坐标。脚本中很少使用矩阵:最常用Vector3,Quaternion,而且Transform类的功能更简单。

单纯的矩阵用于特殊情况,如设置非标准相机投影在Unity中,Matrix4x4被Transform,Camera,Material和GL几个函数使用。

worldToLocalMatrix:矩阵变换的点从世界坐标转为自身坐标(只读)。

localToWorldMatrix:矩阵变换的点从自身坐标转为世界坐标(只读)。


Debug.Log(tran

sform.position);

Debug.Log(transform.localPosition);

Vector4 vec = new Vector4(transform.localPosition.x,transform.localPosition.y,transform.localPosition.z,1);

Debug.Log((transform.parent.localToWorldMatrix*vec));

Vector4 vec2=new Vector4(transform.position.x,transform.position.y,transform.position.z,1); 

Debug.Log(transform.parent.worldToLocalMatrix*vec2);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容