青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The Coder

I am a humble coder.

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  4 隨筆 :: 4 文章 :: 9 評論 :: 0 Trackbacks

OpenGL 中場景進行變換,要經歷一些過程:視圖變換 à 模型變換 à 投影變換,然后到了窗口坐標。這幾個變換開始的時候把我搞很混,這幾天整理一下。

?????? 一般書上把這幾個變換用照相機類比,其實每個變換都是產生著一個 4x4 矩陣,然后與當前矩陣 (Current Matrix) 相乘,得到一個坐標變換矩陣,最后把世界坐標系(歐式空間)中的物體變換到屏幕坐標系中。這里梳理一下概念:

?????? 1 、視圖變換( VIEW Transformation ):它類似將照相機指向物體,即確定視點(觀察點)的位置和觀察方向。一般用的函數為 glu 封裝的函數:

void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,? --------- 觀察點

?????? GLdouble centrex, GLdouble centrey, GLdouble centrez,? -- 視線方向:從 eye 指向 centre

?????? GLdouble upx, GLdouble upy, GLdouble upz ------------ 視圖體自下而上的方向

?)

?????? 這個函數會產生一個視圖矩陣,并右乘到當前矩陣上。模型變換通常發生在模型變換之前。其實,視圖變換也是通過平移和旋轉得到的,觀察位置與物體位置之間是個相對的狀態,我們也把視圖變換和模型變換統一成一個變換,產生一個矩陣:模型視圖變換矩陣。

?????? 2 、模型變換 (MODEL Transformation) :它確定模型的位置和方向,對模型進行旋轉、平移和縮放。用到三個子函數: glTranslate*(x, y, z) glRotate*(x, y, z) 、 glScale*(x, y, z) 。每個函數都會產生一個矩陣,并右乘當前矩陣。

?????? 3 、投影變換( PROJECTION Transformation ):產生一個六面的視圖體,把視圖體以外的場景剪裁掉,把視圖體內的物體、場景作為繪制對象,讓“照相機拍攝”。兩種投影方式,兩個投影函數: glFrustum(left, right, bottom, top, near, far)

glOrtho(left, right, bottom, top, near, far )

這兩個函數的參數非常對稱,都是構筑了一個六面體,形成可視范圍。它們都產生一個矩陣,并左乘當前矩陣。(當然,還有 glu 的兩個函數)。

??????

?????? 要理解整個過程,關鍵在理解當前變換矩陣 CTM ,(簡稱為 C )。它是一個狀態概念,應用到 OpenGL 流水線中的每一個定點: P = C*P’ 。這條等式是對同一個點在兩個坐標系體統之間進行轉換,從右邊的坐標系下的坐標( P’ )轉換到左邊的坐標系下的坐標( P )。而矩陣 C 4x4 的齊次坐標矩陣,它都蘊含著一個局部坐標系信息:以右邊坐標系為參考坐標系統,左邊坐標系的位置和方向。

?????? 用手工定義一個矩陣,如下(按 OpenGL 矩陣方式定義。與數學定義矩陣的方式轉置):

?????? CTM[16] = { a0, a1, a2, a3,???????? // x 軸的方向向量

???????????????????? ?? a4, a5, a6, a7,????????? // y 軸的方向向量

???????????????????? ?? a8, a9, a10, a11,????????????? // z 軸的方向向量

???????????????????? ?? a12, a13, a14, a15??? // 原點的位置

??????????????????????????? }

??????

?????? 再來考察當前變換矩陣 CTM ,它是在 OpenGL 流水線中一個模型視圖矩陣和一個投影矩陣的復合。 CTM = P*C*M 。(注意到上面提到的左乘右乘了嗎?)
?aa.bmp

我們來分析一個簡單的例子: 

?

?

?1 #define ?NUM?0.70710678118654746
?2 // 注意這個矩陣是正交的,沒有正交就用,好像有放縮作用
GLfloat Tmat1[16] = { NUM, NUM, 0.0, 0.0,
??????????????????? -NUM, NUM, 0.0, 0.0,
???????????????????? 0.0, 0.0, 1.0, 0.0,
???????????????????? 0.0, 0.0, 0.0, 1.0};

GLfloat Tmat2[16] = { 1.0, 0.0, 0.0, 0.0,
????????????????????? 0.0, 1.0, 0.0, 0.0,
????????????????????? 0.0, 0.0, 1.0, 0.0,
????????????????????? 1.0, 0.0, 0.0, 1.0,
??????????????????????? };

?7 void ?setupRC( void )
?8 {
?9 ????glClearColor( 0.0f ,? 0.0f ,? 0.0f ,? 1.0f );
10 ????glShadeModel(GL_FLAT);
11 }

12
13 void ?RenderScene( void )
14 {
15 ????printf( " RenderScene\n " );??
16 glClear(GL_COLOR_BUFFER_BIT);
17 glColor3f( 0.0f ,? 1.0f ,? 1.0f );
18 ????glMatrixMode(GL_MODELVIEW);
19 ????glLoadIdentity();
20 ????gluLookAt( 0.0 ,? 0.0 ,? 5.0 ,???????? // ?view?point
21 ?????????????? 0.0 ,? 0.0 ,? 0.0 ,???????? // ?focus?point
22 ?????????????? 0.0 ,? 1.0 ,? 0.0 );??????? // ?up?vector
23
24 ? ?glutSolidCube( 0.5 );???????????????? //  原點的參考位置
25 ????glMultMatrixf(Tmatr1);???????????????? // 這個矩陣的動作和下面的兩個變換是一樣的。
???????????????glMultMatrixf(Tmatr2);
26 // ????glRotatef(45.0,?0.0,?0.0,?1.0);
27 // ????glTranslatef(3.0,?0.0,?0.0);
28 ????glutSolidCube( 1.0 );
29
30 ????glutSwapBuffers();
31 }

32
33 void ?ChangeSize( int ?w,? int ?h)
34 {
35 ????printf( " ChangeSize\n " );??? // 從這里看出,是先調用ChangeSize()的
36 ????GLfloat?nRange? = ? 10.0f ;
37
38 ???? if (h? == ? 0 )
39 ????????h? = ? 1 ;
40 ????GLfloat?fRatio? = ?(GLfloat)w? / ?(GLfloat)h;
41
42 ????glMatrixMode(GL_PROJECTION);
43 ????glLoadIdentity();
44
45 ???? if (w? <= ?h)
46 ????????glOrtho( - nRange,?nRange,? - nRange? / ?fRatio,?nRange? / ?fRatio,? 1.0 ,?nRange);
47 ???? else
48 ????????glOrtho( - nRange? * ?fRatio,?nRange? * ?fRatio,? - nRange,?nRange,? 1.0 ,?nRange);
49
50 ????glViewport( 0 ,? 0 ,?w?,h);
51
52 ????glMatrixMode(GL_MODELVIEW);
53 ????glLoadIdentity();
54 }

55
56 int ?main( int ?argc,? char * ?argv[])
57 {
58 ????glutInit( & argc,?argv);
59 ????glutInitDisplayMode(GLUT_RGB? | ?GLUT_DOUBLE);
60 ????glutInitWindowSize( 800 ,? 600 );
61 ????glutCreateWindow( " example " );
62
63 ????glutReshapeFunc(ChangeSize);
64 ????glutDisplayFunc(RenderScene);
65
66 ????setupRC();
67
68 ????glutMainLoop();
69
70 ????std::cout? << ? " Hello?world! " ? << ?std::endl;
71 ???? return ? 0 ;
72 }

73

glRotatef(45.0, 0.0, 0.0, 1.0)???

glTranslatef(3.0, 0.0, 0.0);  

這兩個變換,可以看成:

?????? glMultMatrixf(R);

?????? glMultMatrixf(T);

R,T 都是右乘到 CTM CTM = CTM * R * T

對模型變換的理解有兩種:

1、在全局固定坐標系下,對物體進行變換。這時候,我們要以相反的順序來考慮代碼中的變換函數了,它的實際過程是這樣 P = CTM *( R*(T* p’)) 。

首先、對物體進行平移,平移到坐標( 3.0, 0.0, 0.0 )?! ∪缓?,把物體相對原點繞z軸旋轉45度。

2、物體捆綁在局部坐標系下,所有的變換都是坐標系進行的。這時,我們用順序來看這個變換。

glRotatef(45.0, 0.0, 0.0, 1.0) 產生一個齊次矩陣 R( 這可是代表一個局部坐標系哦 ) ? ,即局部坐標系 R 相對剛才開始的坐標系 I (單位矩陣)作了旋轉變換,繞旋轉了45度。

glTranslatef(3.0, 0.0, 0.0) 產生一個齊次矩陣 T (也是代表了一個局部坐標系),相對 R 坐標系沿x軸( R 系)平移了3個單位,得到了自己的局部坐標系 T

最后在這個局部坐標系 T 下畫了 Cube 。

代碼中的 Tmat = R * T ,它也是從 T 坐標系變換到 R 坐標系,再變換到最后的模型視圖的世界坐標系。

?

?

后注:

?????? 對坐標系的幾何變換是 既采用基于齊次坐標的矩陣表達形式 ! 又在歐氏幾何的 Cartesian 坐標系下以對其進行說明性的定義 . 由于齊次坐標是射影幾何的語言工具 ! 前者表明幾何變換的表達是基于射影幾何的后者則帶有歐氏幾何色彩 ,所以對它的表述清晰統一的表述比較難。本文寫的也比較零散,有語焉不詳、理解錯誤指出,請多多指正!

?

posted on 2006-08-11 22:27 TH 閱讀(5990) 評論(8)  編輯 收藏 引用

評論

# re: OpenGL的視圖變換 2006-08-15 12:09 可冰
可以完全用OpenGL來做GUI嗎,比如文本輸入框、對話框等等,比起MFC來哪個好用一些。我最近要做GUI程序,但又不想學MFC,不知道該用什么好。  回復  更多評論
  

# re: OpenGL的視圖變換 2006-08-15 16:03 TH
@可冰
呵呵,OpenGL本身是沒有對窗口進行處理能力的.需要借助GLUT庫,處理一些簡單的窗口應用.當然處理能力可能不是很強.
還有一個庫GLUI也許可以滿足你的要求:
/**
GLUI is a GLUT-based C++ user interface library which provides controls such as buttons, checkboxes, radio
buttons, spinners, and listboxes to OpenGL applications. It is window-system independent, relying on GLUT to
handle all system-dependent issues, such as window and mouse management.
**/
當然還有很多很優秀的GUI庫.如smartwin++,wxWidgets等.每種都有其不同的設計特點.按需學習了~~~  回復  更多評論
  

# re: OpenGL的視圖變換 2006-09-08 00:49 嘿嘿
被這個冬冬搞的暈死了   回復  更多評論
  

# re: OpenGL的視圖變換 2006-10-02 20:01 hrbeu
我的頭都暈死了 變換感覺沒有什么難得的啊 可是操作起來 我已經迷糊了
還好 還有一起學OpenGl的朋友 讓我覺得不再孤獨   回復  更多評論
  

# re: OpenGL的視圖變換[未登錄] 2007-03-22 09:08 sophia
好東東
這兩天看得頭暈
上午正想準備,看到了,
收藏了!

模型變換是對坐標系的變換!  回復  更多評論
  

# re: OpenGL的視圖變換 2007-03-31 20:06 hao a
hao a a a a   回復  更多評論
  

# re: OpenGL的視圖變換 2007-10-21 23:48 roger
好像有點小錯誤,“它都蘊含著一個局部坐標系信息:以右邊坐標系為參考坐標系統,左邊坐標系的位置和方向?!?
P=MP',設P是O系坐標,P'是O'系坐標, 那么,按照上述結論,以O‘系為參考,O坐標系的描述為M。那么帶入P=MP',有:
I=MM

這是錯誤的。

其實:設S為O系下O‘系的坐標,那么有:
O系下O‘系的描述=M*O’系下O‘系的描述,即:
S=M*I
S=M
所以M是O系下O‘系的坐標,即左邊坐標系下,右邊坐標系的坐標。

比如,O系下O'系的原點在(3,0,0)’處,那么有:
M=
1003
0100
0010
0001

假設O‘系中有一個點(3,0,0,1)‘,那么,O系中,它在:
M*P‘=(6,0,0,0)  回復  更多評論
  

# re: OpenGL的視圖變換 2009-02-06 04:17 xinxin
博主這文章的觀眾還是挺多的,而且博主挺謙虛的呵呵.
但是,我在此留言是希望讀者在以此文為參考的同時也再在搜索引擎上搜索一下其他文章...
因為這里頭的講述的某些小地方實在是容易讓人誤解的。特別是左右乘的概念。
而我相信博主思路是正確的,這些都是表述上的問題而已。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久免费视频一区| 国产一区二区| 午夜国产精品视频免费体验区| 欧美成人午夜77777| 狼狼综合久久久久综合网 | 国产精品免费观看视频| 欧美日韩国产综合在线| 欧美日韩一区二区三区在线视频 | 欧美一区二区国产| 欧美一区二区在线播放| 久久夜精品va视频免费观看| 久久久久免费视频| 欧美精品成人一区二区在线观看 | 亚洲欧美日韩国产综合在线| 欧美一区二区三区播放老司机| 久久国产精品久久久久久久久久 | 日韩亚洲一区在线播放| 亚洲私人黄色宅男| 久久精品一区蜜桃臀影院| 美脚丝袜一区二区三区在线观看 | 国产色综合网| 亚洲激情专区| 性感少妇一区| 亚洲二区在线观看| 最新亚洲一区| 久久精品盗摄| 亚洲国产一二三| 亚洲一区二区动漫| 久久影院午夜片一区| 欧美日韩中文字幕| 在线观看91精品国产麻豆| 在线视频精品一| 久久视频在线视频| 一二三四社区欧美黄| 久久免费精品日本久久中文字幕| 欧美另类在线观看| 伊人激情综合| 欧美在线中文字幕| 亚洲美女在线观看| 麻豆精品精品国产自在97香蕉| 国产精品久在线观看| 亚洲日韩欧美视频一区| 久久精品视频在线观看| 99精品欧美一区二区三区综合在线 | 亚洲欧美日韩成人| 欧美日韩免费| 亚洲欧洲精品一区二区三区| 久久久精品国产免费观看同学| 亚洲美女色禁图| 欧美剧在线免费观看网站| 亚洲国产欧美日韩另类综合| 久久这里只有| 欧美在线日韩精品| 国产日韩欧美一区二区三区在线观看 | 欧美国产三区| 久久另类ts人妖一区二区| 国产视频一区在线观看| 新狼窝色av性久久久久久| 一区二区三区久久| 欧美日韩一区二区三区| 一区二区三区导航| 夜夜嗨网站十八久久| 欧美涩涩视频| 性做久久久久久免费观看欧美| 亚洲一本视频| 国产一区视频观看| 蜜桃av久久久亚洲精品| 久久一区视频| 亚洲乱码视频| 亚洲视频免费观看| 国产精品视频网站| 久久九九国产| 麻豆91精品| 亚洲免费精彩视频| 中文精品在线| 国产视频一区在线观看一区免费 | 国产精品99久久久久久www| 91久久中文字幕| 欧美特黄一级| 久久免费视频在线观看| 免费成人av在线看| 亚洲天堂黄色| 性欧美1819性猛交| 亚洲第一福利社区| 亚洲欧洲精品一区| 国产精品久久久久久久午夜片| 欧美一进一出视频| 久久综合一区二区三区| 亚洲色图在线视频| 午夜久久tv| 亚洲精品1234| 亚洲性感美女99在线| 在线观看一区视频| 这里只有精品在线播放| 伊大人香蕉综合8在线视| 亚洲美女av在线播放| 国产日韩精品在线| 91久久亚洲| 国语自产精品视频在线看8查询8| 亚洲黑丝在线| 国产亚洲日本欧美韩国| 亚洲精品免费一区二区三区| 国产亚洲欧美另类一区二区三区| 亚洲激情图片小说视频| 国产日韩欧美综合精品| 亚洲精品美女91| 伊大人香蕉综合8在线视| 一区二区欧美亚洲| 亚洲精品日韩综合观看成人91| 欧美一区1区三区3区公司| 一区二区三区四区五区在线| 久久亚洲国产成人| 久久久久久久一区二区| 国产精品www994| 最新日韩在线视频| 亚洲韩日在线| 久久久久久久综合色一本| 午夜一区二区三区不卡视频| 欧美国产免费| 欧美大片一区二区三区| 国内精品视频在线播放| 亚洲综合丁香| 亚洲一级片在线观看| 欧美激情精品久久久久| 欧美成人午夜激情视频| 精品99视频| 久久精品国产精品亚洲综合| 欧美一区二区高清在线观看| 欧美午夜不卡视频| 日韩一级大片在线| 一区二区欧美视频| 欧美日韩国产123| 亚洲另类在线一区| 一级日韩一区在线观看| 欧美激情亚洲一区| 亚洲激情成人在线| 日韩一本二本av| 欧美日韩高清一区| 一本久久综合| 性欧美xxxx视频在线观看| 国产精品入口夜色视频大尺度| 亚洲一区日韩在线| 国产午夜精品一区理论片飘花| 亚洲欧美在线一区二区| 久久精品道一区二区三区| 国产农村妇女精品一二区| 亚洲综合精品自拍| 久久精品91久久香蕉加勒比 | 日韩一二在线观看| 欧美极品一区| 亚洲伦理自拍| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美三区不卡| 亚洲欧美一区二区三区久久| 久久久久久欧美| 亚洲国产女人aaa毛片在线| 欧美阿v一级看视频| 91久久中文| 欧美亚洲一区三区| 激情久久久久| 欧美日韩高清在线观看| 亚洲欧美亚洲| 亚洲第一中文字幕| 亚洲综合另类| 亚洲第一伊人| 国产精品伦子伦免费视频| 久久国产精品久久久久久电车| 欧美国产先锋| 欧美与黑人午夜性猛交久久久| 伊人男人综合视频网| 欧美日韩1区| 欧美一区二区三区日韩| 亚洲人成久久| 久久国产手机看片| 99精品久久免费看蜜臀剧情介绍| 国产精品久久久久影院色老大| 性欧美8khd高清极品| 亚洲欧洲一区二区三区| 久久精品视频免费播放| 在线视频欧美日韩精品| 伊人精品久久久久7777| 欧美日韩亚洲一区二区| 久久久久久婷| 亚洲女与黑人做爰| 亚洲国产三级| 蜜臀av在线播放一区二区三区| 亚洲欧美电影院| 亚洲精品欧美日韩| 伊人久久综合97精品| 国产精品一区二区久激情瑜伽| 欧美国产日韩精品| 久久日韩粉嫩一区二区三区| 亚洲一二三四区| 亚洲精品视频在线观看网站| 女人色偷偷aa久久天堂| 久久久久久久性| 久久精品三级| 欧美一区二区在线观看| 亚洲永久免费观看| 99精品国产福利在线观看免费 |