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研究还不够深入,一些专业词语,假设翻译有误.欢迎大家指 ...
随机推荐
- JVM调优浅谈(转)
1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...
- Memcached 1.4.20 发布,集中式缓存系统
内存缓存Memcached 1.4.20发布.2014-05-12 上一个版本是2014-05-01的1.4.19 此版本只修正了一个1.4.18和1.4.19中引入的Bug. 此版本只是修复了导致 ...
- 如何让jquery-easyui的combobox像select那样不可编辑
http://zhidao.baidu.com/link?url=td61iIn_MBCs1FvT7b-B9Lp9VzlyrcnGmSbkCy1EsSzuod5o47zTmJFRQ-xizxdqv1E ...
- android 百度地图开发实例(转载)
因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...
- C++ 运算符重载二(一元运算符重载)
//一元运算符重载 #include<iostream> using namespace std; class Point { public: Point(int x,int y){ th ...
- 让div也出现滑动框。
<div id="box" style="height: 300px; width: 200px; border:1px solid #CCC; overflow: ...
- hmacSHA1
import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; publ ...
- hdu 4709:Herding(叉积求三角形面积+枚举)
Herding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 剑指 offer set 24 扑克牌的顺子
题目 从扑克牌中任意抽取出 5 张牌, 判断是不是顺子, 并且大小王可以看成任意的数字 思路 1. 把大小王当做 0 插入到数组中, 然后对数组排序 2. 统计相邻两个数之间的空隙数, 若空隙数大于 ...
- 剑指 offer set 14 打印 1 到 N 中 1 的个数
总结 1. 假设 n == 2212, 算法分为两个步骤. 第一步, 将这个 2212 个数分为 1~ 212, 213 ~ 2212 2. 第一部分实际上是将 n 的规模缩小到 212. 假如知道如 ...