unity旋转(Unity旋转的坐标用什么值类型)
本文目录一览:
- 1、Unity旋转物体时怎么固定住一个轴?
- 2、unity3d中如何旋转物体,但坐标轴却不旋转??
- 3、unity 手指旋转角色的功能
- 4、Unity基础-Transform
- 5、U3D如何让物体旋转一定角度
- 6、unity中如何让物体以一定速度沿y轴旋转90度?
Unity旋转物体时怎么固定住一个轴?
移动的视频
unity旋转(Unity旋转的坐标用什么值类型)
旋转的视频
1.1 可以用手指进行旋转。
1.2 点击角色时可以触发
在需要检测的物体上 首先物体要有Collider 添加脚本 使用OnMouse系列方法(脚本的enable不影响OnMouse的调用)
先说一下 有哪些封装好的公共方法
然后说一下使用方法
1.通过编辑器中添加
在Inspector中添加EventTrigger的componnent组件,然后点击Add New Event Type按钮添加一个基本的
当我们选择一个的时候,就相当于将要于此绑定了,例如当我们选择Pointer Click的时候,绑定了这个组件的物体将接受Pointer Click 的消息,当我们在物体上按下鼠标的时候,(当然空间中的物体我们是无法通过鼠标点击的,但是当我们可以通过射线碰撞的方法,来实现Pointer Enter,Pointer Exit等的触发)这里我们用来绑定这个EventTrigger 的是一个UI Panel 这样便可以让它接受我们自定义的单击了
别忘了 在下添加一个Physics Raycaster的组件,用来检测鼠标射线
考虑到以后的扩展,我们使用第三种方式来实现具体的功能。
将脚本挂到要旋转的物体上就可以进行旋转了。
效果如下图:
1,你可以做判断,用transform.Rotate,当转过90度后停止旋转
2,用四元数的插值运算transform.rotation
=
Quaternion.Lerp(from.rotation,
to.rotation,
Time.time
speed);from.rotation在start获取一下当前的rotation,to.rotation就是旋转90度后的rotation
任何游戏对象在创建的时候都会附带Transform组件,用于储存并控物体的位置、旋转和缩放。
并且该组件是无法删除的。
Transform面板一共包含3个属性:
Position:位置
Rotation:旋转
Scale:(缩放)
可修改对象的位置、旋转方式、缩放数值
ition;世界坐标系位置
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: MonoBehiour
{
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.ition);
Debug.Log(transform.localPosition);
Vector4 vec = new Vector4(transform.localPosition.x,transform.localPosition.y,transform.localPosition.z,1);
Debug.Log((transform.parent.localToWorldMatrixvec));
Vector4 vec2=new Vector4(transform.ition.x,transform.ition.y,transform.ition.z,1);
Debug.Log(transform.parent.worldToLocalMatrixvec2);
UNITY里的旋转是基于四元数的,很难通过直接修改XYZ的某一角度达到直观的效果;
如果你想让枪口保持指向目标,了解一下Quaternion.LookRotation(Vector3 dir);的用法,十分简单
unity3d中如何旋转物体,但坐标轴却不旋转??
移动的视频
旋转的视频
1.1 可以用手指进行旋转。
1.2 点击角色时可以触发
在需要检测的物体上 首先物体要有Collider 添加脚本 使用OnMouse系列方法(脚本的enable不影响OnMouse的调用)
先说一下 有哪些封装好的公共方法
然后说一下使用方法
1.通过编辑器中添加
在Inspector中添加EventTrigger的componnent组件,然后点击Add New Event Type按钮添加一个基本的
当我们选择一个的时候,就相当于将要于此绑定了,例如当我们选择Pointer Click的时候,绑定了这个组件的物体将接受Pointer Click 的消息,当我们在物体上按下鼠标的时候,(当然空间中的物体我们是无法通过鼠标点击的,但是当我们可以通过射线碰撞的方法,来实现Pointer Enter,Pointer Exit等的触发)这里我们用来绑定这个EventTrigger 的是一个UI Panel 这样便可以让它接受我们自定义的单击了
别忘了 在下添加一个Physics Raycaster的组件,用来检测鼠标射线
考虑到以后的扩展,我们使用第三种方式来实现具体的功能。
将脚本挂到要旋转的物体上就可以进行旋转了。
效果如下图:
1,你可以做判断,用transform.Rotate,当转过90度后停止旋转
2,用四元数的插值运算transform.rotation
=
Quaternion.Lerp(from.rotation,
to.rotation,
Time.time
speed);from.rotation在start获取一下当前的rotation,to.rotation就是旋转90度后的rotation
任何游戏对象在创建的时候都会附带Transform组件,用于储存并控物体的位置、旋转和缩放。
并且该组件是无法删除的。
Transform面板一共包含3个属性:
Position:位置
Rotation:旋转
Scale:(缩放)
可修改对象的位置、旋转方式、缩放数值
ition;世界坐标系位置
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: MonoBehiour
{
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.ition);
Debug.Log(transform.localPosition);
Vector4 vec = new Vector4(transform.localPosition.x,transform.localPosition.y,transform.localPosition.z,1);
Debug.Log((transform.parent.localToWorldMatrixvec));
Vector4 vec2=new Vector4(transform.ition.x,transform.ition.y,transform.ition.z,1);
Debug.Log(transform.parent.worldToLocalMatrixvec2);
UNITY里的旋转是基于四元数的,很难通过直接修改XYZ的某一角度达到直观的效果;
如果你想让枪口保持指向目标,了解一下Quaternion.LookRotation(Vector3 dir);的用法,十分简单
以相机为例,写入以下代码:public var cm:Camera;//Camera Objectpublic var maxRotationAngle = 20;//Max Rotation Angle each sideprivate var currentAngle = .0;function Update () { var cfAngle = 15 Time.deltaTime; if(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) { cfAngle = -cfAngle; } else if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) { } else { return; } var newcurrentAngle = currentAngle + cfAngle; if(newcurrentAngle > maxRotationAngle) newcurrentAngle = maxRotationAngle; if(newcurrentAngle < -maxRotationAngle) newcurrentAngle = -maxRotationAngle; cfAngle = newcurrentAngle - currentAngle; currentAngle = newcurrentAngle; cm.transform.Rotate(cm.transform.InverseTransformDirection(Vector3.up) cfAngle); }
可以尝试将这个物体设置为一个空物体的子物体。
这样在旋转的时候,旋转的物体的坐标轴,但是我使用其父物体(空物体)的坐标轴并没有改变。
这个是我的方法,如果有人有好方法,请一定告诉我,多谢。
unity 手指旋转角色的功能
移动的视频
旋转的视频
1.1 可以用手指进行旋转。
1.2 点击角色时可以触发
在需要检测的物体上 首先物体要有Collider 添加脚本 使用OnMouse系列方法(脚本的enable不影响OnMouse的调用)
先说一下 有哪些封装好的公共方法
然后说一下使用方法
1.通过编辑器中添加
在Inspector中添加EventTrigger的componnent组件,然后点击Add New Event Type按钮添加一个基本的
当我们选择一个的时候,就相当于将要于此绑定了,例如当我们选择Pointer Click的时候,绑定了这个组件的物体将接受Pointer Click 的消息,当我们在物体上按下鼠标的时候,(当然空间中的物体我们是无法通过鼠标点击的,但是当我们可以通过射线碰撞的方法,来实现Pointer Enter,Pointer Exit等的触发)这里我们用来绑定这个EventTrigger 的是一个UI Panel 这样便可以让它接受我们自定义的单击了
别忘了 在下添加一个Physics Raycaster的组件,用来检测鼠标射线
考虑到以后的扩展,我们使用第三种方式来实现具体的功能。
将脚本挂到要旋转的物体上就可以进行旋转了。
效果如下图:
Unity基础-Transform
移动的视频
旋转的视频
1.1 可以用手指进行旋转。
1.2 点击角色时可以触发
在需要检测的物体上 首先物体要有Collider 添加脚本 使用OnMouse系列方法(脚本的enable不影响OnMouse的调用)
先说一下 有哪些封装好的公共方法
然后说一下使用方法
1.通过编辑器中添加
在Inspector中添加EventTrigger的componnent组件,然后点击Add New Event Type按钮添加一个基本的
当我们选择一个的时候,就相当于将要于此绑定了,例如当我们选择Pointer Click的时候,绑定了这个组件的物体将接受Pointer Click 的消息,当我们在物体上按下鼠标的时候,(当然空间中的物体我们是无法通过鼠标点击的,但是当我们可以通过射线碰撞的方法,来实现Pointer Enter,Pointer Exit等的触发)这里我们用来绑定这个EventTrigger 的是一个UI Panel 这样便可以让它接受我们自定义的单击了
别忘了 在下添加一个Physics Raycaster的组件,用来检测鼠标射线
考虑到以后的扩展,我们使用第三种方式来实现具体的功能。
将脚本挂到要旋转的物体上就可以进行旋转了。
效果如下图:
1,你可以做判断,用transform.Rotate,当转过90度后停止旋转
2,用四元数的插值运算transform.rotation
=
Quaternion.Lerp(from.rotation,
to.rotation,
Time.time
speed);from.rotation在start获取一下当前的rotation,to.rotation就是旋转90度后的rotation
任何游戏对象在创建的时候都会附带Transform组件,用于储存并控物体的位置、旋转和缩放。
并且该组件是无法删除的。
Transform面板一共包含3个属性:
Position:位置
Rotation:旋转
Scale:(缩放)
可修改对象的位置、旋转方式、缩放数值
ition;世界坐标系位置
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: MonoBehiour
{
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.ition);
Debug.Log(transform.localPosition);
Vector4 vec = new Vector4(transform.localPosition.x,transform.localPosition.y,transform.localPosition.z,1);
Debug.Log((transform.parent.localToWorldMatrixvec));
Vector4 vec2=new Vector4(transform.ition.x,transform.ition.y,transform.ition.z,1);
Debug.Log(transform.parent.worldToLocalMatrixvec2);
U3D如何让物体旋转一定角度
移动的视频
旋转的视频
1.1 可以用手指进行旋转。
1.2 点击角色时可以触发
在需要检测的物体上 首先物体要有Collider 添加脚本 使用OnMouse系列方法(脚本的enable不影响OnMouse的调用)
先说一下 有哪些封装好的公共方法
然后说一下使用方法
1.通过编辑器中添加
在Inspector中添加EventTrigger的componnent组件,然后点击Add New Event Type按钮添加一个基本的
当我们选择一个的时候,就相当于将要于此绑定了,例如当我们选择Pointer Click的时候,绑定了这个组件的物体将接受Pointer Click 的消息,当我们在物体上按下鼠标的时候,(当然空间中的物体我们是无法通过鼠标点击的,但是当我们可以通过射线碰撞的方法,来实现Pointer Enter,Pointer Exit等的触发)这里我们用来绑定这个EventTrigger 的是一个UI Panel 这样便可以让它接受我们自定义的单击了
别忘了 在下添加一个Physics Raycaster的组件,用来检测鼠标射线
考虑到以后的扩展,我们使用第三种方式来实现具体的功能。
将脚本挂到要旋转的物体上就可以进行旋转了。
效果如下图:
1,你可以做判断,用transform.Rotate,当转过90度后停止旋转
2,用四元数的插值运算transform.rotation
=
Quaternion.Lerp(from.rotation,
to.rotation,
Time.time
speed);from.rotation在start获取一下当前的rotation,to.rotation就是旋转90度后的rotation
任何游戏对象在创建的时候都会附带Transform组件,用于储存并控物体的位置、旋转和缩放。
并且该组件是无法删除的。
Transform面板一共包含3个属性:
Position:位置
Rotation:旋转
Scale:(缩放)
可修改对象的位置、旋转方式、缩放数值
ition;世界坐标系位置
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: MonoBehiour
{
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.ition);
Debug.Log(transform.localPosition);
Vector4 vec = new Vector4(transform.localPosition.x,transform.localPosition.y,transform.localPosition.z,1);
Debug.Log((transform.parent.localToWorldMatrixvec));
Vector4 vec2=new Vector4(transform.ition.x,transform.ition.y,transform.ition.z,1);
Debug.Log(transform.parent.worldToLocalMatrixvec2);
UNITY里的旋转是基于四元数的,很难通过直接修改XYZ的某一角度达到直观的效果;
如果你想让枪口保持指向目标,了解一下Quaternion.LookRotation(Vector3 dir);的用法,十分简单
以相机为例,写入以下代码:public var cm:Camera;//Camera Objectpublic var maxRotationAngle = 20;//Max Rotation Angle each sideprivate var currentAngle = .0;function Update () { var cfAngle = 15 Time.deltaTime; if(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) { cfAngle = -cfAngle; } else if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) { } else { return; } var newcurrentAngle = currentAngle + cfAngle; if(newcurrentAngle > maxRotationAngle) newcurrentAngle = maxRotationAngle; if(newcurrentAngle < -maxRotationAngle) newcurrentAngle = -maxRotationAngle; cfAngle = newcurrentAngle - currentAngle; currentAngle = newcurrentAngle; cm.transform.Rotate(cm.transform.InverseTransformDirection(Vector3.up) cfAngle); }
unity中如何让物体以一定速度沿y轴旋转90度?
移动的视频
旋转的视频
1.1 可以用手指进行旋转。
1.2 点击角色时可以触发
在需要检测的物体上 首先物体要有Collider 添加脚本 使用OnMouse系列方法(脚本的enable不影响OnMouse的调用)
先说一下 有哪些封装好的公共方法
然后说一下使用方法
1.通过编辑器中添加
在Inspector中添加EventTrigger的componnent组件,然后点击Add New Event Type按钮添加一个基本的
当我们选择一个的时候,就相当于将要于此绑定了,例如当我们选择Pointer Click的时候,绑定了这个组件的物体将接受Pointer Click 的消息,当我们在物体上按下鼠标的时候,(当然空间中的物体我们是无法通过鼠标点击的,但是当我们可以通过射线碰撞的方法,来实现Pointer Enter,Pointer Exit等的触发)这里我们用来绑定这个EventTrigger 的是一个UI Panel 这样便可以让它接受我们自定义的单击了
别忘了 在下添加一个Physics Raycaster的组件,用来检测鼠标射线
考虑到以后的扩展,我们使用第三种方式来实现具体的功能。
将脚本挂到要旋转的物体上就可以进行旋转了。
效果如下图:
1,你可以做判断,用transform.Rotate,当转过90度后停止旋转
2,用四元数的插值运算transform.rotation
=
Quaternion.Lerp(from.rotation,
to.rotation,
Time.time
speed);from.rotation在start获取一下当前的rotation,to.rotation就是旋转90度后的rotation
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。