osg中camera->setViewMatrixAsLopengl 的函數相當於opengl中的glulookat
openGL變換小節:
視圖:指定觀察者或攝像機的位置
模型:在情境中移動對象
模型視圖:描述視圖變換盒模型變換的對偶性
投影:對視見空間進行修剪和改變大小
視見區: 對到視窗的最終輸出進行縮放
眼座標:來自觀察者的觀察點,與可能發生的任何變換無關,可以把它們視為“絕對”螢幕座標。因此並不是真正的座標,而是代表一個虛擬固定座標系,用作參考的公用架構。大部分變換都是根據它們相對於眼座標系的效果來描述的。
視圖變換的過程如下:視圖(eye)變換或者模型變換,投影變換(正射投影和透視投影),視見區變換。
利用實用庫函數gluLookAt()設定視覺座標系。在實際的編程應用中,使用者在完成情境的建模後,往往需要選擇一個合適的視角或者不停地變換視角,以對情境作觀察。實用庫函數gluLookAt()就提供了這樣的一個功能。
void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,
GLdouble centerx,GLdouble centery,GLdouble centerz,
GLdouble upx,GLdouble upy,GLdouble upz);
該函數定義一個視圖矩陣,並與當前矩陣相乘。
eyex, eyey,eyez 指定視點的位置
centerx,centery,centerz 指定參考點的位置
upx,upy,upz 指定視點向上的方向
視點E、參考點C、視點向上的方向U實際上就是設定了一個視覺座標系。這個視覺座標系的原點是E,視線的方向(即z軸)是C-U,y軸方向就是視點向上的方向U,剩下的x軸方向就是向量((C-E)*U)。由於y軸和x軸是垂直的,所以也要求向量(C-U)和U互相垂直。這點在設定該函數參數時是必須注意的。
還是最後一句:
由於y軸和x軸是垂直的,所以也要求向量(C-E)和U互相垂直。這點在設定該函數參數時是必須注意的。
應用中不垂直也是沒問題的,所以有找了個可能更合理的解釋
void gluLookAt(
GLdouble eyex,
GLdouble eyey,
GLdouble eyez,
GLdouble centerx,
GLdouble centery,
GLdouble centerz,
GLdouble upx,
GLdouble upy,
GLdouble upz
);
eye=(eyex, eyey, eyez)是視點(原點)的位置
center = (centerx, centery, centerz)是視口中心點的位置
center - eye是z軸負方向
z = (eye - center) / |eye - center|
up = (upx, upy, upz) - eye表示上方
x軸正方向x = up × z / |up × z|
y軸正方向(就是正上方)y = z × x
原文地址:http://blog.163.com/zhaoxin851055@126/blog/static/81129298200921052929831/