利用實用庫函數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-U)和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
恩,1樓正解,那我說個詳細的
視點變換可以通過gluLookAt()函數完成,那三組參數分別指定了相機的位置、瞄準方向的參考點和相機向上方向。
通常視點變換操作在模型變換操作之前發出,以便模型變換先對物體發生作用。這樣,情境中物體的頂點經過模型轉換後一定到所希望的位置,然後再對情境進行視點定位等操作。模型變換和視點變換共同構成模型視景矩陣。
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
1、改變前三個參數的值可以類比人在實際環境中的移動;
2、改變中間三個參數的值,可以類比人眼的轉動,即所觀察情境的變化。
3、後三個參數的值比較特殊,它所制定的不是一個點,而是一個方向,即決定將哪一個座標軸作為向上的方向,如果向上方向與觀察點到中心點的方向一致,結果將是不確定的。