旋轉變換(一)旋轉矩陣

1. 簡介

計算機圖形學中的應用非常廣泛的變換是一種稱為仿射變換的特殊變換,在仿射變換中的基本變換包括平移、旋轉、縮放、剪切這幾種。本文以及接下來的幾篇文章重點介紹一下關于旋轉的變換,包括二維旋轉變換、三維旋轉變換以及它的一些表達方式(旋轉矩陣、四元數、歐拉角等)。

2. 繞原點二維旋轉

首先要明確旋轉在二維中是繞著某一個點進行旋轉,三維中是繞著某一個軸進行旋轉。二維旋轉中最簡單的場景是繞著坐標原點進行的旋轉,如下圖所示:

2DRotation

如圖所示點v 繞 原點旋轉θθ?角,得到點v’,假設 v點的坐標是(x, y) ,那么可以推導得到 v’點的坐標(x’, y’)(設原點到v的距離是r,原點到v點的向量與x軸的夾角是???)?
x=rcos?y=rsin?x=rcos?y=rsin??
x=rcos(θ+?)y=rsin(θ+?)x′=rcos(θ+?)y′=rsin(θ+?)?
通過三角函數展開得到?
x=rcosθcos??rsinθsin?x′=rcosθcos??rsinθsin??
y=rsinθcos?+rcosθsin?y′=rsinθcos?+rcosθsin??
帶入x和y表達式得到?
x=xcosθ?ysinθx′=xcosθ?ysinθ?
y=xsinθ+ycosθy′=xsinθ+ycosθ?
寫成矩陣的形式是:?

[xy]=[cosθsinθ?sinθcosθ]?[xy][x′y′]=[cosθ?sinθsinθcosθ]?[xy]


盡管圖示中僅僅表示的是旋轉一個銳角θθ的情形,但是我們推導中使用的是三角函數的基本定義來計算坐標的,因此當旋轉的角度是任意角度(例如大于180度,導致v’點進入到第四象限)結論仍然是成立的。

?

3. 繞任意點的二維旋轉

繞原點的旋轉是二維旋轉最基本的情況,當我們需要進行繞任意點旋轉時,我們可以把這種情況轉換到繞原點的旋轉,思路如下:?
1. 首先將旋轉點移動到原點處?
2. 執行如2所描述的繞原點的旋轉?
3. 再將旋轉點移回到原來的位置

2DArbitraryRotate

也就是說在處理繞任意點旋轉的情況下需要執行兩次平移的操作。假設平移的矩陣是T(x,y),也就是說我們需要得到的坐標 v’=T(x,y)*R*T(-x,-y)(我們使用的是列坐標描述點的坐標,因此是左乘,首先執行T(-x,-y))

在計算機圖形學中,為了統一將平移、旋轉、縮放等用矩陣表示,需要引入齊次坐標。(假設使用2x2的矩陣,是沒有辦法描述平移操作的,只有引入3x3矩陣形式,才能統一描述二維中的平移、旋轉、縮放操作。同理必須使用4x4的矩陣才能統一描述三維的變換)。

對于二維平移,如下圖所示,P點經過x和y方向的平移到P’點,可以得到:

2DTranslate

x=x+txy=y+tyx′=x+txy′=y+ty?
由于引入了齊次坐標,在描述二維坐標的時候,使用(x,y,w)的方式(一般w=1),于是可以寫成下面矩陣的形式

?

???xy1???=???100010txty1???????xy1???[x′y′1]=[10tx01ty001]?[xy1]


按矩陣乘法展開,正好得到上面的表達式。也就是說平移矩陣是?

???100010txty1???[10tx01ty001]


如果平移值是(-tx,-ty)那么很明顯平移矩陣式?

???100010?tx?ty1???[10?tx01?ty001]


我們可以把2中描述的旋轉矩陣也擴展到3x3的方式,變為:?

???xy1???=???cosθsinθ0?sinθcosθ0001???????xy1???[x′y′1]=[cosθ?sinθ0sinθcosθ0001]?[xy1]


從平移和旋轉的矩陣可以看出,3x3矩陣的前2x2部分是和旋轉相關的,第三列與平移相關。有了上面的基礎之后,我們很容易得出二維中繞任意點旋轉的旋轉矩陣了,只需要把三個矩陣乘起來即可:

?

?

M=???100010txty1???????cosθsinθ0?sinθcosθ0001???????100010?tx?ty1???=???cosθsinθ0?sinθcosθ0(1?cosθ)tx+ty?sinθ(1?cosθ)ty?tx?sinθ1???M=[10tx01ty001]?[cosθ?sinθ0sinθcosθ0001]?[10?tx01?ty001]=[cosθ?sinθ(1?cosθ)tx+ty?sinθsinθcosθ(1?cosθ)ty?tx?sinθ001]

?

4. 三維基本旋轉

我們可以把一個旋轉轉換為繞基本坐標軸的旋轉,因此有必要討論一下繞三個坐標值x、y、z的旋轉。?
本文在討論過程中使用的是類似于OpenGL中定義的右手坐標系,同時旋轉角度的正負也遵循右手坐標系的約定。如下圖所示

RightHanderRule

4.1 繞X軸的旋轉

在三維場景中,當一個點P(x,y,z)繞x軸旋轉θθ角得到點P’(x’,y’,z’)。由于是繞x軸進行的旋轉,因此x坐標保持不變,y和z組成的yoz(o是坐標原點)平面上進行的是一個二維的旋轉,可以參考上圖(y軸類似于二維旋轉中的x軸,z軸類似于二維旋轉中的y軸),于是有:?
x=xx′=x?
y=ycosθ?zsinθy′=ycosθ?zsinθ?
z=ysinθ+zcosθz′=ysinθ+zcosθ?
寫成(4x4)矩陣的形式?

?????xyz1?????=?????10000cosθsinθ00?sinθcosθ00001???????????xyz1?????[x′y′z′1]=[10000cosθ?sinθ00sinθcosθ00001]?[xyz1]

?

4.2 繞Y軸旋轉

繞Y軸的旋轉和繞X軸的旋轉類似,Y坐標保持不變,除Y軸之外,ZOX組成的平面進行一次二維的旋轉(Z軸類似于二維旋轉的X軸,X軸類似于二維旋轉中的Y軸,注意這里是ZOX,而不是XOZ,觀察上圖中右手系的圖片可以很容易了解到這一點),同樣有:?
x=zsinθ+xcosθx′=zsinθ+xcosθ?
y=yy′=y?
z=zcosθ?xsinθz′=zcosθ?xsinθ?
寫成(4x4)矩陣的形式?

?????xyz1?????=?????cosθ0?sinθ00100sinθ0cosθ00001???????????xyz1?????[x′y′z′1]=[cosθ0sinθ00100?sinθ0cosθ00001]?[xyz1]

?

4.3 繞Z軸旋轉

與上面類似,繞Z軸旋轉,Z坐標保持不變,xoy組成的平面內正好進行一次二維旋轉(和上面討論二維旋轉的情況完全一樣)?

?????xyz1?????=?????cosθsinθ00?sinθcosθ0000100001???????????xyz1?????[x′y′z′1]=[cosθ?sinθ00sinθcosθ0000100001]?[xyz1]

?

4.4 小結

上面描述了三維變換中繞單一軸旋轉的矩陣表達形式,繞三個軸旋轉的矩陣很類似,其中繞y軸旋轉的矩陣與繞x和z軸旋轉的矩陣略有點不同(主要是三個軸向順序和書寫矩陣的方式不一致導致的,繞三個不同坐標旋轉軸以及其他二個坐標軸組成平面的順序是: XYZ(繞x軸) YZX(繞y軸) ZXY(繞z軸),其中繞y軸旋轉,其他兩個軸是ZX,這和我們書寫矩陣按

?????xyz1?????[xyz1]


的方式不一致,而導致看起來繞Y軸旋轉的矩陣似乎是和其他兩個矩陣不一致。如果我們顛倒寫法,將公式寫成?

?????zyx1?????=?????cosθ0sinθ00100?sinθ0cosθ00001???????????zyx1?????[z′y′x′1]=[cosθ0?sinθ00100sinθ0cosθ00001]?[zyx1]


的方式,那么這三個旋轉矩陣看起來在形式上就統一了,都是?

[cosθsinθ?sinθcosθ][cosθ?sinθsinθcosθ]


這種表現形式了(左上角都是?sinθ?sinθ)

?

5. 繞任意軸的三維旋轉

繞任意軸的三維旋轉可以使用類似于繞任意點的二維旋轉一樣,將旋轉分解為一些列基本的旋轉。繞任意軸旋轉如下圖所示:

RotateArbitrary

P點繞向量u旋轉θθ角,得到點Q,已知P點的坐標和向量u,如何求Q點的坐標。?
我們可以把向量u進行一些旋轉,讓它與z軸重合,之后旋轉P到Q就作了一次繞Z軸的三維基本旋轉,之后我們再執行反向的旋轉,將向量u變回到它原來的方向,也就是說需要進行的操作如下:?
1. 將旋轉軸u繞x軸旋轉至xoz平面?
2. 將旋轉軸u繞y軸旋轉至于z軸重合?
3. 繞z軸旋轉θθ角?
4. 執行步驟2的逆過程?
5. 執行步驟1的逆過程?
原始的旋轉軸u如下圖所示:

OriginVector_u?
第1、2、3步驟如下圖所示:?
Step2?
Step3?
Step4

步驟1將向量u旋轉至xoz平面的操作是一個繞x軸的旋轉操作,步驟2將向量u旋轉到與z軸重合,第1、2步驟的示意圖如下:

RotateToZ?
作點P在yoz平面的投影點q,q的坐標是(0, b, c),原點o與q點的連線oq和z軸的夾角就是u繞x軸旋轉的角度。通過這次旋轉使得u向量旋轉到xoz平面(圖中的or向量)【步驟1】?
過r點作z軸的垂線,or與z軸的夾角為ββ, 這個角度就是繞Y軸旋轉的角度,通過這次旋轉使得u向量旋轉到與z軸重合【步驟2】

步驟1中繞x軸旋轉的是一次基本的繞x軸的三維旋轉,按照之前的討論,旋轉矩陣是:?

?????10000cosθsinθ00?sinθcosθ00001?????[10000cosθ?sinθ00sinθcosθ00001]


這里的θθ就是圖中所示的αα角 (注意αα角度是繞x旋轉的正的角度)?
從圖中我們還可以得到:?

cosα=c(b2+c2)???????√cosα=c(b2+c2)


sinα=b(b2+c2)???????√sinα=b(b2+c2)


于是旋轉矩陣(記作?Rx(α)Rx(α))為:?

?????????10000c(b2+c2)√b(b2+c2)√00?b(b2+c2)√c(b2+c2)√00001?????????[10000c(b2+c2)?b(b2+c2)00b(b2+c2)c(b2+c2)00001]


在完成步驟1之后,向量u被變換到了r的位置,我們繼續步驟2的操作,繞y軸旋轉負的ββ角(注意:這里的ββ是負的),經過這次變換之后向量u與z軸完全重合,由于這一步也是執行的一次繞Y軸的基本旋轉,旋轉矩陣(記作?Ry(?β)Ry(?β))為:?

?????cosθ0?sinθ00100sinθ0cosθ00001?????[cosθ0sinθ00100?sinθ0cosθ00001]


使用?β?β替換表達式中的θθ,此外根據圖中描述,我們可以計算得到:?

cosβ=(b2+c2)???????√(a2+b2+c2)???????????√cosβ=(b2+c2)(a2+b2+c2)


sinβ=a(a2+b2+c2)???????????√sinβ=a(a2+b2+c2)


帶入上面的表達式,于是旋轉矩陣(記作?Ry(?β)Ry(?β))為:?

????????????(b2+c2)√(a2+b2+c2)√0a(a2+b2+c2)√00100?a(a2+b2+c2)√0(b2+c2)√(a2+b2+c2)√00001????????????[(b2+c2)(a2+b2+c2)0?a(a2+b2+c2)00100a(a2+b2+c2)0(b2+c2)(a2+b2+c2)00001]

?

在完成前面兩個步驟之后,u方向和z軸完全重合,因此執行旋轉θθ角,執行的是一次繞z軸的基本三維旋轉(記作?R(θ)R(θ),根據之前的討論,我們可以得到:?

?????cosθsinθ00?sinθcosθ0000100001?????[cosθ?sinθ00sinθcosθ0000100001]


最后兩步驟是前面1和2的逆操作,也就是繞Y軸旋轉ββ?和繞X軸旋轉?α?α,這兩個矩陣分別記作?Ry(β)Ry(β)?和?Rx(?α)Rx(?α),得到它們的方式很簡單,只需要將上面步驟1和步驟2中的角度修改成相反數即可,也就是:

?

?

Ry(β)=????????????(b2+c2)√(a2+b2+c2)√0?a(a2+b2+c2)√00100a(a2+b2+c2)√0(b2+c2)√(a2+b2+c2)√00001????????????Ry(β)=[(b2+c2)(a2+b2+c2)0a(a2+b2+c2)00100?a(a2+b2+c2)0(b2+c2)(a2+b2+c2)00001]


Rx(?α)=?????????10000c(b2+c2)√?b(b2+c2)√00b(b2+c2)√c(b2+c2)√00001?????????Rx(?α)=[10000c(b2+c2)b(b2+c2)00?b(b2+c2)c(b2+c2)00001]

?

最終得到 繞任意軸u旋轉的旋轉矩陣是【因為使用的列向量,因此執行的是左乘(從右往左)】:

?

MR=Rx(?α)Ry(β)Rz(θ)Ry(?β)Rx(α)=MR=Rx(?α)Ry(β)Rz(θ)Ry(?β)Rx(α)=


roateMatrix?
(注:式中的(u,v,w)對應上文中向量(a,b,c),公式我自己筆算過,為了減少編輯公式的時間(使用LaTex編輯太繁瑣,因此找了一張公式的圖片貼在此處)

?

如果向量是經過單位化的(單位向量),那么有a2+b2+c2=1a2+b2+c2=1,可以簡化上述的公式,得到:

NormalizedRotate

參考文獻:

    1. Wiki Rotation (mathematics)
    2. Euler’s rotation theorem
    3. Maths - Rotation Matrices
    4. 繞任意軸旋轉
    5. Rotation About an Arbitrary Axis in 3 Dimensions
    6. Rotation about an Arbitrary Axis (Line)

轉載于:https://www.cnblogs.com/h2zZhou/p/9074126.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389591.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據預處理 泰坦尼克號_了解泰坦尼克號數據集的數據預處理

數據預處理 泰坦尼克號什么是數據預處理? (What is Data Pre-Processing?) We know from my last blog that data preprocessing is a data mining technique that involves transforming raw data into an understandable format. Real-world data is often incom…

Pytorch中DNN入門思想及實現

DNN全連接層(線性層) 計算公式: y w * x b W和b是參與訓練的參數 W的維度決定了隱含層輸出的維度,一般稱為隱單元個數(hidden size) b是偏差值(本文沒考慮) 舉例: 輸…

IDEA去除mapper.xml文件中的sql語句的背景色

2019獨角獸企業重金招聘Python工程師標準>>> IDEA版本 2017.3 mapper.xml文件中的sql語句,總是黃色一大片,看起來不舒服。 按如下設置進行設置即可 此時設置完還有點背景色 再進行一個設置 Ok,完美解決 轉載于:https://my.oschina.net/u/3939…

vc6.0 繪制散點圖_vc有關散點圖的一切

vc6.0 繪制散點圖Scatterplots are one of the most popular visualization techniques in the world. Its purposes are recognizing clusters and correlations in ‘pairs’ of variables. There are many variations of scatter plots. We will look at some of them.散點圖…

sudo配置臨時取得root權限

sudo配置臨時取得root權限系統中的普通用戶有時需要root權限執行某種操作,要是使用su - root的話必須要知道root的密碼,這是不安全的,所以有了sudo,root可以對/etc/sudoers做一定的配置,讓普通用戶在不切換到root的情況…

Pytorch中RNN入門思想及實現

RNN循環神經網絡 整體思想: 將整個序列劃分成多個時間步,將每一個時間步的信息依次輸入模型,同時將模型輸出的結果傳給下一個時間步,也就是說后面的結果受前面輸入的影響。 RNN的實現公式: 個人思路: 首…

小扎不哭!FB又陷數據泄露風波,9000萬用戶受影響

對小扎來說,又是多災多難的一個月。 繼不久前Twitter曝出修補了一個可能造成數以百萬計用戶私密消息被共享給第三方開發人員的漏洞,連累Facebook股價跟著短線跳水之后,9月28日,Facebook又雙叒叕曝出因安全漏洞遭到黑客攻擊&#…

在衡量歐洲的政治意識形態時,調查規模的微小變化可能會很重要

(Related post: On a scale from 1 to 10, how much do the numbers used in survey scales really matter?)(相關文章: 從1到10的量表,調查量表中使用的數字到底有多重要? ) At Pew Research Center, survey questions about respondents’…

Pytorch中CNN入門思想及實現

CNN卷積神經網絡 基礎概念: 以卷積操作為基礎的網絡結構,每個卷積核可以看成一個特征提取器。 思想: 每次觀察數據的一部分,如圖,在整個矩陣中只觀察黃色部分33的矩陣,將這【33】矩陣(點乘)權重得到特…

java常用設計模式一:單例模式

1、餓漢式 package singleton.demo;/*** author Administrator* date 2019/01/07*/ public class Singleton {//在調用getInstance方法前,實例已經創建好private static Singleton instance new Singleton();//私有構造,防止被實例化private Singleton(…

SDUT-2121_數據結構實驗之鏈表六:有序鏈表的建立

數據結構實驗之鏈表六:有序鏈表的建立 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 輸入N個無序的整數,建立一個有序鏈表,鏈表中的結點按照數值非降序排列,輸出該有序鏈表。 Input 第一行輸入整數個數N&…

事件映射 消息映射_映射幻影收費站

事件映射 消息映射When I was a child, I had a voracious appetite for books. I was constantly visiting the library and picking new volumes to read, but one I always came back to was The Phantom Tollbooth, written by Norton Juster and illustrated by Jules Fei…

前端代碼調試常用

轉載于:https://www.cnblogs.com/tabCtrlShift/p/9076752.html

Pytorch中BN層入門思想及實現

批歸一化層-BN層(Batch Normalization) 作用及影響: 直接作用:對輸入BN層的張量進行數值歸一化,使其成為均值為零,方差為一的張量。 帶來影響: 1.使得網絡更加穩定,結果不容易受到…

JDK源碼學習筆記——TreeMap及紅黑樹

找了幾個分析比較到位的,不再重復寫了…… Java 集合系列12之 TreeMap詳細介紹(源碼解析)和使用示例 【Java集合源碼剖析】TreeMap源碼剖析 java源碼分析之TreeMap基礎篇 關于紅黑樹: Java數據結構和算法(十一)——紅黑樹 【數據結…

匿名內部類和匿名類_匿名schanonymous

匿名內部類和匿名類Everybody loves a fad. You can pinpoint someone’s generation better than carbon dating by asking them what their favorite toys and gadgets were as a kid. Tamagotchi and pogs? You were born around 1988, weren’t you? Coleco Electronic Q…

Pytorch框架中SGD&Adam優化器以及BP反向傳播入門思想及實現

因為這章內容比較多,分開來敘述,前面先講理論后面是講代碼。最重要的是代碼部分,結合代碼去理解思想。 SGD優化器 思想: 根據梯度,控制調整權重的幅度 公式: 權重(新) 權重(舊) - 學習率 梯度 Adam…

朱曄和你聊Spring系列S1E3:Spring咖啡罐里的豆子

標題中的咖啡罐指的是Spring容器,容器里裝的當然就是被稱作Bean的豆子。本文我們會以一個最基本的例子來熟悉Spring的容器管理和擴展點。閱讀PDF版本 為什么要讓容器來管理對象? 首先我們來聊聊這個問題,為什么我們要用Spring來管理對象&…

ab實驗置信度_為什么您的Ab測試需要置信區間

ab實驗置信度by Alos Bissuel, Vincent Grosbois and Benjamin HeymannAlosBissuel,Vincent Grosbois和Benjamin Heymann撰寫 The recent media debate on COVID-19 drugs is a unique occasion to discuss why decision making in an uncertain environment is a …

基于Pytorch的NLP入門任務思想及代碼實現:判斷文本中是否出現指定字

今天學了第一個基于Pytorch框架的NLP任務: 判斷文本中是否出現指定字 思路:(注意:這是基于字的算法) 任務:判斷文本中是否出現“xyz”,出現其中之一即可 訓練部分: 一&#xff…