左右手座標系的轉換問題。
左右手座標系的差別在於幾個方面:
1. 首先左右手座標系的攝像機座標系的構造方式是不同的,區別在於右手座標中攝像機座標系的負Z軸方向代表了,攝像機的方向也就是。而左手座標系中的正Z軸代表了攝像機方向。因此在左手座標系中攝像機座標系的Z軸是(Look at - eyepos)而右手座標系中攝像機的Z軸則是(eyepos - Look at )因為右手座標系中Z軸和攝像機方向相反。接下來對於使用者定義的攝像機Up方向也就是攝像機座標系的Y軸,左右手座標系都是相同的,最後是攝像機的Right方向(攝像機的X軸)定義為Z Cross Y 這裡Cross代表叉積的意思,這個叉積的結果是什麼呢,結果是得到一個垂直於Z和Y組成平面的一個向量。關於叉積的這個向量他是符合從Z轉到Y的左右手旋轉法則的為什麼說左右手,這是因為如果全局座標系是右手座標系的話,那麼這個Right向量的計算結果符合右手螺旋法則。如果在左手座標系中的話則符合左手螺旋法則。舉個非常簡單的例子。如果攝像機的Z軸向量在全局座標系中的座標是(1,0,0)也就是全局座標系中的X軸,Y軸向量在全局座標系中的座標是(0,1,0),那麼攝像機Z軸的全局座標 =攝像機 Y的全局座標 Cross 攝像機 Z軸的全局座標 = (0 ,1 ,0)Cross (1,0,0)= (0,0,-1)也就是說最後攝像機X軸的世界是全局座標系中的負Z方向。如果你在紙上分別畫出2個座標系的話,就可以知道在左手座標系中使用左手法則從Y軸轉到X軸是負Z軸方向,在右手座標系中則是使用右手法則從Y軸轉到X軸是負Z軸方向。
那麼這麼做有什麼好處呢。這樣一來如果你朝向攝像機的方向(注意是攝像機方向不是攝像機的Z方向因為右手座標系中攝像機是負Z方向)並且你的腳向頭部朝向攝像機的Y方向那麼你的右邊就是攝像機的Right(X軸)方向了,這是符合常理的因為不管D3D還是OpenGl都是把正X的點畫在螢幕的右方,負X的點畫在螢幕的左方的,如果你的右邊是攝像機X軸的負方向那麼原先你期待畫到右邊的點最終會按照螢幕做了個反射,其結果就是圖形和所想得左右顛倒。因為圖形API只認X軸的正負,並不知道X軸到底在你的哪一邊。這裡要注意我說的這種狀態必須是和攝像機座標系的構造方式和全局座標系的左右手座標系相一致才能夠,達到。具體來說
1:如果在左手全局座標系中你必須將攝像機的Z軸定位攝像機的方向然後計算Right方向這樣計算出來的Right方向才能夠符合前面所說的面朝攝像機方向(攝像機正Z軸)然後腳到頭的向量和攝像機Y軸一致,這時候Right向量才會在你的右邊。>.<不高興畫圖了,有疑問的話可以自己試一下。
2:如果右手全局座標系的話你必須將攝像機的負Z軸定位攝像機的方向然後計算Right方向這樣計算出來的Right方向才能夠符合前面所說的面朝攝像機方向(攝像機負Z軸)然後腳到頭的向量和攝像機Y軸一致,這時候Right向量也會在你的右邊。
3:如果你非要在左手全局座標系中使用 (2)的攝像機座標構造方法也就是把負Z軸定位攝像機的方向然後計算Right方向,你會發覺你死的很慘,因為最終的Right方向並不會在你的右邊而是到了你的左邊。最終結果就是,,,左右映像顛倒。事與願違不相信你也可以自己畫張圖試試看是不是這樣構造出來的Right方向到了你的左邊。。。
4:如果你非要在右手全局座標系中使用 (1)的攝像機座標構造方法也就是把Z軸定位攝像機的方向然後計算Right方向,你同樣會發覺你死的很慘,因為最終的Right方向並不會在你的右邊而是到了你的左邊。最終結果也是,,,左右映像顛倒。事與願違。
5:如果你已經處於3 ,4的狀態又不想在視矩證的構造上作改動。。那麼唯一的方法就是去改投影矩陣通過在投影矩陣中將X座標取翻,具體就是在D3D中將投影矩陣第一列取反,在Opengl中將投影矩證第一行取反。但是這樣做完全屬於職能劃分不明確,因該由視矩陣完成的事情卻交給了投影矩陣去做
今天先寫到。改天在用數學簡單推導以下使用Opengl和D3D的視矩證和投影矩陣為什麼會畫出左右顛倒的2負映像。