上周找到了新公司。这周二来上班。可怕的是我刚去的第二天下午四点领导通知我做一个VRdemo,要求第二天交。我勒个擦。我现在对设备还没熟悉呢。连sdk都没下载而且距离上一次开发vr是在快两年之前了。属实让我措手不及。没错,按剧本走,加班到凌晨。累屁了。下面记录下我在开发项目中遇到对Quaternion的使用。
Quaternion是四元数的类。而四元数是可以操作一个物体的旋转。我们百度可以看到四原数可如下表示:
没错,标准的四元数w在第一位,接下来是xyz分量。上式代表物体绕着(vx,vy,vz)轴旋转度。我们先不管(vx,vy,vz)代表的是世界坐标系下的轴还是本地坐标系下的轴。这个我们在后面会区分。而unity的四元数构造器如下:
所以我们可能需要调整下对应值的顺序。
如果我们想绕着y轴旋转90度,对应代码如下:
//声明一个四元数 按照公式往里填数Quaternion q = new Quaternion(0,Mathf.Sin(Mathf.Deg2Rad*90/2),0, Mathf.Cos(Mathf.Deg2Rad * 90 / 2));transform.rotation = transform.rotation*q;
我们把这个脚本挂到物体上会发现,物体会绕着自身的Y轴旋转90度。我们记得四元数是左乘,于是我们换一下位置尝试下:
//声明一个四元数 按照公式往里填数Quaternion q = new Quaternion(0,Mathf.Sin(Mathf.Deg2Rad*90/2),0, Mathf.Cos(Mathf.Deg2Rad * 90 / 2));transform.rotation = q*transform.rotation;
我们再次测试发现物体绕着世界坐标的Y周旋转。所以综上我们可以得出两个结论:
- 四元数右乘是代表绕着被旋转物体本地对应的坐标轴旋转。而左乘代表绕着世界坐标对应的坐标轴旋转。
- 四元数旋转是按着顺时针方向旋转的。(角度是正值的情况下)
后面会更新一篇关于在开发vr过程中对四元数使用的文章。至于以上原理是啥,我也不太清楚。四元数是半路学的而且也不专业。希望以后明白了原理再来更新。以上是本博客的内容,如果有不正确的地方欢迎指出。
更:两个四元数相乘表示两次旋转。上次两个左乘右乘结果不同是因为旋转顺序不同导致的。
2020. 3.24更
已知莫个物体的欧拉角为(0,30,0)not local,求此物体的x轴正向所指的方向。
Quaternion q = Quaternion.Euler(EluerAngle);Vector3 tranRight =q* Vector3.right;



![Unity3D - 详解Quaternion类[转载]](https://img-blog.csdnimg.cn/c483c41d74754e688620c250ec1ef653.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1bmhhbzUyMTExMQ==,size_16,color_FFFFFF,t_70#pic_center)










