一、2D中向量旋轉公式推導
已知向量(x,y)旋轉θ角之后得到向量(x',y')
如下圖所示
這時我可以看到的是信息是
旋轉后的向量與之前的向量長度r它是不變的
第一個向量所具有的信息是
旋轉后的向量所具有的信息是
根據三角函數公式
將此關系式拆開就可以得到
最后可以得到
寫成矩陣形式
二、從局部空間變換到世界空間SRT矩陣中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'⊥了
僅供參考
四、Unity中解決萬向節鎖
1、首先什么是萬向節鎖1、首先什么是萬向節鎖
按我的理解就是,正常情況直接使用transform.localEulerAngles是沒問題的,但是根據Unity的zxy的旋轉規則,當你是先繞x軸(pitch俯仰)旋轉90度后,這時再去單獨旋轉y(Yaw偏航),和單獨旋轉z,效果都是繞z軸(Roll桶滾)旋轉,這就不是我們要的結果了。
然后解決的辦法就是用四元數(Quaternion)
2、什么是四元數
這個我推薦去b站搜四元數
3、結論
通過了解與實際操作后,將歐拉角帶入unity四元數Quaternion.Euler()中即可。
Unity官方文檔關於Quaternion的描述:
https://docs.unity3d.com/ScriptReference/Quaternion.html
本人之前在搞攝像機跟隨旋轉視角和人物轉向的時候踩過一次坑,之后通過各種資源知道了用四元數,所以在這按自己的想法記錄下,同時也推薦朋友們去了解,共同進步