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研究还不够深入,一些专业词语,假设翻译有误.欢迎大家指 ...
随机推荐
- sama5d36 can0 can1 测试
1 删除/bin/ip 保留/sbin/ip 2 ip link set can0 type can bitrate 125000 ip link set can1 type can bitrate ...
- Redis-stat is not found
$ruby -v ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux] $gem -v 2.2.2 $which ruby /usr/lo ...
- 第二百五十八节,Tornado框架-逻辑处理get()方法和post()方法,初识模板语言
Tornado框架-逻辑处理get()方法和post()方法,初识模板语言 Tornado框架,逻辑处理里的get()方法,和post()方法 get()方法,处理get方式的请求post()方法,处 ...
- 嵌入式开发之gb281818
http://www.cnblogs.com/snake-hand/p/3157176.html http://blog.csdn.net/voipmaker/article/category/140 ...
- db2 improt from coldel0x7c
db2 load from "C:\20110816\20110816_BankEnterpri seCA.txt" OF del modified by coldel0x7c r ...
- 手机游戏运营主要的指标是什么? 7天活跃, 14天活跃 ARPU ?如何提升游戏 app 的虚拟道具的收入?
数据采集越细,手段越丰富,所获得的数据也就更加详实,虽然手机游戏没有网游那么复杂,但也需要数据化运营,而且是必要的,是优化游戏收入的关键,大家最主要关心的是下面三类数据的指标 1. 用户数量首先,在移 ...
- Window发声函数Beep、MessageBeep
C++ Code 1234567891011 WINBASEAPI BOOL WINAPI Beep(__in DWORD dwFreq, __in DWORD dwDuration ...
- STL容器:list双向链表学习
list是一个双向列表容器,完成了标准C++数据结构中链表的所有功能; list与vector和deque类似,只不过其中的对象提供了对元素的随机访问. STL以双向链表的方式实现list,访问需要从 ...
- 第二十一篇:Linux 操作系统中的进程结构
前言 在 Linux 中,一个正在执行的程序往往由各种各样的进程组成,这些进程除了父子关系,还有其他的关系.依赖于这些关系,所有进程构成一个整体,给用户提供完整的服务( 考虑到了终端,即与用户的交互 ...
- 使用vue来做局部刷新
我们都知道,vue的组件化是他最强大的核心所在,路由也是特别可爱的一部分,但是路由适合一些大型的组件,看url路径的时候会出现变化,但是有时候我们想要一些小的局部小刷新,这个时候就需要用到它的动态组件 ...