Unity3D Quaternion各属性和函数測试
Quaternion属性与方法
一,属性:
x、y、z就不说了,仅仅看一个eulerAngles。代码例如以下:
- public Quaternion rotation = Quaternion.identity;
- void Start()
- {
- rotation.eulerAngles = new Vector3(0, 30, 0);
- transform.rotation = rotation;
- print(rotation.eulerAngles.y);
- }
效果:将物体绕y轴顺时针转30°,效果与transform.eulerAngles同样。
物体rotation = (0,30,0)。可是不能直接为transform.rotation.eulerAngle赋值。
二。方法
1,function ToAngleAxis (out angle :float, out axis :Vector3) :void
- public float angle = 0.0F;
- public Vector3 axis = Vector3.zero;
- void Start()
- {
- transform.eulerAngles = new Vector3(0, 90, 0);
- transform.rotation.ToAngleAxis(out angle, out axis);
- print(angle + " " + axis);
- }
效果:将物体的旋转角度返回到angles和axis里(物体的z轴和世界坐标z轴的夹角)。
输入:transform.localEulerAngles=(0,0,0);
输出:angle=0, axis=(1,0,0);
输入:transform.localEulerAngles=(0,90,0);
输出:angle=90,axis=(0,1,0);
输入:transform.localEulerAngles=(270,0,0);
输出:angle=90,axis=(-1,0,0)
2。function SetFromToRotation (fromDirection :Vector3, toDirection :Vector3) :void
- private Vector3 _from = Vector3.one;
- private Vector3 _to = new Vector3(100f, 200f, 100f);
- private Quaternion q;
- private Vector3 headUpDir;
- void Start()
- {
- q.SetFromToRotation(_from, _to);
- transform.rotation=q;
- headUpDir=transform.TransformDirection(Vector3.forward);
- }
效果:把物体的fromDirection旋转到toDirection
输入:a=Vector3(0,0,1); b=Vector3(0,1,0)//把z轴朝向y轴
输出: q=(-0.7,0,0,0.7); headUpDir=(0,1,0)
输入:a=Vector3(0,0,1); b=Vector3(1,0,0)//把z轴朝向x轴
输出: q=(0,0.7,0,0.7); headUpDir=(1,0,0)
输入:a=Vector3(0,1,0); b=Vector3(1,0,0)//把y轴朝向x轴
输出: q=(0,0,-0.7,0.7); headUpDir=(0,0,1)
3,function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void
- public Transform obj1;
- public Transform obj2;
- Quaternion q;
- void Update()
- {
- q.SetLookRotation(obj1.position, obj2.position);
- transform.rotation = q;
- }
效果:相似于LookAt()方法,使物体1始终注视着物体2
4, static operator * (lhs : Quaternion, rhs : Quaternion) : Quaternion
- public Transform extraRotation;
- void Update()
- {
- transform.rotation *= extraRotation.rotation;
- }
效果:组合旋转lhs和rhs。旋转一个点,首先用lhs。然后用rhs旋转,与使用组合旋转同样。注意旋转不可交换: lhs*rhs不等于rhs*lhs。 我理解旋转的角度就是将*号两边的角度加起来。
5,static operator * (rotation : Quaternion, point : Vector3) : Vector3
- Vector3 relativeDirection = Vector3.forward;
- Vector3 absoluteDirection;
- void Update () {
- absoluteDirection = transform.rotation * relativeDirection;
- transform.position += absoluteDirection * Time.deltaTime;
- }
效果:将一个向量依据rotation旋转到还有一个向量。
6。static function Dot (a : Quaternion, b : Quaternion) : float
效果:将两个Quaternion点乘,返回一个float值,意义待补充。
7,static function AngleAxis (angle : float, axis : Vector3) : Quaternion
- void Start(){
- transform.rotation = Quaternion.AngleAxis(30, Vector3.up);
- }
效果:将物体绕axis旋转angle度。
8。static function FromToRotation (fromDirection :Vector3, toDirection :Vector3)
: Quaternion
- transform.rotation = Quaternion.FromToRotation(Vector3.up, transform.forward);
效果:跟SetFromToRotation几乎相同,差别是能够返回一个Quaternion。通经常使用来让transform的一个轴向(比如 y轴)与toDirection在世界坐标中同步。
9,static function LookRotation (forward :Vector3, upwards :Vector3 =Vector3.up)
: Quaternion
效果:跟SetLootRotation几乎相同,差别是能够返回一个Quaternion。
10,static function Slerp (from : Quaternion, to : Quaternion, t :float) : Quaternion
- public Transform from;
- public Transform to;
- public float speed = 0.1F;
- void Update() {
- transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.time * speed);
- }
效果:球面插值,插值不是等角速度的。而是变速的。 会有越来越慢的感觉。
11,static function Lerp (from : Quaternion, to : Quaternion, t :float) : Quaternion
效果:与Slerp效果几乎相同,效率比Slerp高可是假设from和to相差过大效果会不好,会返回一个标准化的Quaternion。
12,static function RotateTowards (from : Quaternion, to : Quaternion, maxDegreesDelta :float) : Quaternion
效果:旋转一个角度从from向to。与Slerp基本同样,但这个函数的角速度永远不会超过maxDegreesDelta。负的maxDegreesDelta值将使旋转远离to。
13。static function Inverse (rotation : Quaternion) : Quaternion
效果:返回反向的旋转。
14,static function Angle (a : Quaternion, b : Quaternion) :float
- public Transform target;
- void Update(){
- float angle = Quaternion.Angle(transform.rotation, target.rotation);
- }
效果:返回a和b两者之间的角度。
15,static function Euler (x :float, y :float, z :float) : Quaternion .
- public Quaternion rotation = Quaternion.Euler(0, 30, 0);
效果:把旋转角度变成相应的Quaternion。
三,实例
- var target : Transform;
- var edgeBorder = 0.1;
- var horizontalSpeed = 360.0;
- var verticalSpeed = 120.0;
- var minVertical = 20.0;
- var maxVertical = 85.0;
- private var x = 0.0;
- private var y = 0.0;
- private var distance = 0.0;
- function Start()
- {
- x = transform.eulerAngles.y;
- y = transform.eulerAngles.x;
- distance = (transform.position - target.position).magnitude;
- }
- function LateUpdate()
- {
- var dt = Time.deltaTime;
- x -= Input.GetAxis("Horizontal") * horizontalSpeed * dt;
- y += Input.GetAxis("Vertical") * verticalSpeed * dt;
- y = ClampAngle(y, minVertical, maxVertical);
- var rotation = Quaternion.Euler(y, x, 0);
- var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
- //print(rotation + " && " + rotation * Vector3(0.0, 0.0, -distance));
- transform.rotation = rotation;
- transform.position = position;
- }
- static function ClampAngle (angle : float, min : float, max : float) {
- if (angle < -360)
- angle += 360;
- if (angle > 360)
- angle -= 360;
- return Mathf.Clamp (angle, min, max);
- }
很有意思的一个样例,来自Unity官方projectShadowDemoProject,效果是能够通过键盘使摄像机环绕一点自由旋转。相似于在一个球面上运动。
- var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
这一句很有意思。也很难理解,全然理解了这一句后,Quaternion在你手里会变的很强大。
Unity3D Quaternion各属性和函数測试的更多相关文章
- Unity3D Quaternion各属性和函数测试
Quaternion属性与方法 一,属性: x.y.z就不说了,只看一个eulerAngles,代码如下: public Quaternion rotation = Quaternion.identi ...
- eclipse下的ssh框架整合过程及測试
最近在搭建Stuts2+hibernate+spring的框架,网上看的教程,大部分都是非常easy的步骤.没有比較具体的步骤以及每一个步骤完毕之后怎样检查是否配置成功.下面是笔者依据自己搭建的过程进 ...
- Jmeter接口測试
一.创建project.引包 1.创建JAVAproject 2.引入Jmeter中lib\ext基础包:ApacheJMeter_java.jar.ApacheJMeter_core.jar 3.引 ...
- JMeter 压力測试使用函数和 CSV 文件參数化 json 数据
在 http Load Testing 中.json 数据的提交是个让人头疼的问题.本文具体介绍怎样进行 JMeter 的 json 測试提交,以及怎样将其參数化. St ...
- C++高精度性能測试函数
在实际software开发工作中.我们常常会測试某个module或者function的执行效率.或者是某个算法的时间复杂度(尽管时间复杂度一定程度上依赖于机器性能.但在同一台computer上,经过算 ...
- python第三方库系列之十九--python測试使用的mock库
一.为什么须要mock 在写unittest的时候,假设系统中有非常多外部依赖,我们不须要也不希望把全部的部件都执行一遍.比方,要验证分享到微博的功能,假设每次測试的时候都要真实地把接 ...
- DLL程序的创建步骤和測试程序
首先,创建DLL程序 然后,加入一个导出类 比如: //Test.h #pragma once class AFX_EXT_CLASS Test { public: Test(void); ~Te ...
- 在Eclipse中使用JUnit4进行单元測试(0基础篇)
本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...
- [WebGL入门]十九,遮挡剔除和深度測试
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外.鄙人webgl研究还不够深入,一些专业词语,假设翻译有误.欢迎大家指 ...
随机推荐
- LT和ET模式
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include &l ...
- catch signal
捕抓信号 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,称为捕抓信号. 除了SIGSTOP和SIGKILL进程能够忽略或捕获其他的全部信号. 注:信号可从两个不同分类角度对信号进行分 ...
- Easyui Datagrid相同连续列合并扩展(三)
function MergeCells(seletor, rows, fields) { if(rows == null || rows.length == 0 || fields == null | ...
- IOC控制反转
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”. 1996年,Michael Mattson在一篇有关探讨面 ...
- Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Function问题解决
selenium 目录下的lib文件夹下的所有包都加到类库里
- Unity四元数和旋转
四元数介绍 旋转,应该是三种坐标变换——缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转. ...
- vs2010更新EF模型时报错
尝试从数据库进行更新时,遇到类型为“Microsoft.VSDesigner.Data.Local.ConnectionStringConverterServiceException”的异常.异常消息 ...
- Thinkphp中如何书写按照指定字段同步更新的ORM
群友提出一个问题,如何在更新某个字段的时候同步另一个字段数据过来,即 update table set column1 =column2 where xxx 写原生SQL当然可行,不过既然有ORM那就 ...
- iOS开发之--如何修改TabBarItem的title的字体和颜色/BarButtonItem的title的字体大小和颜色/添加背景图片,并添加点击方法
在进行项目的过程中,我们往往会遇到各种各样的自定义颜色和字体,下面提供一种修改系统自带的TabBarItem的字体和颜色的方法,希望能帮到大家: [[UITabBarItem appearance] ...
- 控制iOS 7中的状态栏
本文转载至:http://blog.csdn.net/pucker/article/details/12112105 苹果终于发布了iOS 7正式版,大批的用户都已经纷纷进行了升级.如果App是由Xc ...