已知向量(x,y)旋转θ角之后得到向量(x',y')
如下图所示
这时我可以看到的是信息是
旋转后的向量与之前的向量长度r它是不变的
第一个向量所具有的信息是
旋转后的向量所具有的信息是
根据三角函数公式
将此关系式拆开就可以得到
最后可以得到
写成矩阵形式
我这里是unity的左手坐标系,所以接下来我都用左手定则来阐述
首先我们先看,绕z轴的3维坐标变换
z坐标保持不变,旋转x、y坐标,这可不就是我们上面推导的二维坐标系的旋转公式吗
这样我们可以直接得到
除了y轴旋转有点不同,x轴与z轴都是在相应位置的二维旋转变换
那么为什么y轴会不同
看旋转方向
绕z轴旋转,是从x轴开始,绕原点逆时针旋转(你也可以想成x叉乘y,正好等于z轴)
绕x轴旋转,是从y轴开始,也绕原点逆时针旋转(你也可以想成y叉乘z,正好等于x轴)
可是绕y轴旋转,是从x轴开始,绕原点逆时针旋转(x叉乘z,等于-y)
所以相当于把角度向反方向旋转,这就等于了绕y轴旋转,旋转矩阵不同的记忆方法
害,之前硬啃《Unity Shader入门精要》的时候没多想,直接硬记,果然这些东西还是自己有能力推一遍会更加深刻吧
在图形学中,我们经常会遇到绕轴旋转的问题,这里先记录下欧拉角公式里的绕任意轴旋转
下面是我学习笔记,思路可能结果和思路都有可能出错,不代表绝对,仅供参考。
假设一个向量n(0,0,1),并将它看作旋转轴,再假设一点v(x,y,z),绕n向量(轴),旋转θ角,得到v’(x1,y1,z1).
首先我先找到它们共有的信息:
显然||v||模是等于||v’||模的.
根据向量加减,我们可以得到
(向量v等于水平方向v//加竖直方向v⊥)
由这张图我们可以想到,,那么我们先求出向量
是向量v投影到向量n的长度再乘于**单位向量n **得到的。
非常好,我已经得到一个已知量了,只要再求个v'⊥就可以了,
我们不妨求个垂直于v//与v'⊥的向量w
根据
这些都是我们已知的了,代入方程式1;
自此我们得到了x基向量v'⊥
很好,再来求个y基向量也就是向量w,我们就可以知道旋转后的v'⊥
根据方程式2:
同轴同向叉乘无意义,最后得
完事了,最后将方程填完就可以得到v'⊥了
仅供参考
按我的理解就是,正常情况直接使用transform.localEulerAngles是没问题的,但是根据Unity的zxy的旋转规则,当你是先绕x轴(pitch俯仰)旋转90度后,这时再去单独旋转y(Yaw偏航),和单独旋转z,效果都是绕z轴(Roll桶滚)旋转,这就不是我们要的结果了。
然后解决的办法就是用四元数(Quaternion)
这个我推荐去b站搜四元数
通过了解与实际操作后,将欧拉角带入unity四元数Quaternion.Euler()中即可。
Unity官方文档关于Quaternion的描述:
https://docs.unity3d.com/ScriptReference/Quaternion.html
本人之前在搞摄像机跟随旋转视角和人物转向的时候踩过一次坑,之后通过各种资源知道了用四元数,所以在这按自己的想法记录下,同时也推荐朋友们去了解,共同进步