真Unity3d_四元数Quaternion

来源:互联网 发布:Ios11关闭4g网络 编辑:程序博客网 时间:2024/05/22 01:37

如果想完全,详细的了解四元素,可以看清华妹子的文章

http://blog.csdn.net/candycat1992/article/details/41254799

其他人的博客好像也没有说很清楚

清华妹子的这个文章现在有12W的浏览量,反正我是三年前看的,3年前没懂,3年后也没懂

反正unity3d里面的用法就是2个

第一个用法是:2个对象的面对面,敌人面对玩家,或者玩家瞄准敌人

Quaternion rotate = Quaternion.LookRotation (_player.transform.position - transform.position ,Vector3.up);

一开始,我自以为懂点矢量运算(之前做过RTS游戏),然后这么写

Vector3 dir = _player.transform.position * 0.95f - transform.position;GameObject obj = vp_Utility.Instantiate (Bullect, transform.position, Quaternion.Euler (dir)) as GameObject;

结果当然是不行的,射线总是差几度,有些偏移

网上说这么写,其实应该2个变量调转的,我的测试结果是射线45度向上的,不知为可(按我的理解应该是reverse)

transform.position - target.position
但其实根据我的理解的矢量运算,应该确实是2个变量调换

应该是,target 矢量- source矢量

结果我的target 是 _player,

所以,_player.transform.position - transform.position

结果是我的需求,没毛病

这个问题搞了半天,就一个面对面问题,从中午搞到凌晨一点多,终于用LookRotation 方法搞定,机智如我,马上开个方便面助助兴


第二个用法是:四元数乘以三维矢量

1.计算angent的人物目标向量和人物当前转向向量,之间的夹角

Vector3 velocity = Quaternion.Inverse(transform.rotation) * agent.desiredVelocity;float angle = Mathf.Atan2(velocity.x, velocity.z) * 180.0f / 3.14159f;


2.最最普通的设置人物旋转

Quaternion.Euler (0, currentRotationAngle, 0);

3.很简单的朝向改变 ,下面代码中,lastDirection是摄像机向前的射线向量,重点是LookRotation()方法,意思明显就是获取和摄像机向量相同的四元数

Hololance.rotation = Quaternion.AngleAxis(0,Vector3.right);Hololance.rotation = Hololance.rotation* Quaternion.LookRotation( lastDirection);
这么写,应该是等价的,多个四元数相乘

Hololance.rotation = Quaternion.AngleAxis(0,Vector3.right) * Quaternion.LookRotation( lastDirection);



关于四元数的一些深入测试研究

worldRotation = Quaternion.AngleAxis(deltaRotation, camera.transform.forward) * worldRotation;

我碰到的第一问题就是四元数相乘,到底是什么意思呢

矢量和矢量的乘积,可以构成新的标量

而四元数的乘积又是怎么一回事呢?


可以从下面这个哥们的博文,反推一点四元数知识,但其实他也写不怎么好,他是想做一个测试是,但是文章一开头确说四元数乘以矢量,也就是四元数乘三维矢量,不知道他是到底搞清楚了没有

http://www.cnblogs.com/hont/p/5958167.html