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

The Coder

I am a humble coder.

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  4 隨筆 :: 4 文章 :: 9 評(píng)論 :: 0 Trackbacks

OpenGL 中場(chǎng)景進(jìn)行變換,要經(jīng)歷一些過程:視圖變換 à 模型變換 à 投影變換,然后到了窗口坐標(biāo)。這幾個(gè)變換開始的時(shí)候把我搞很混,這幾天整理一下。

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

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

void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,? --------- 觀察點(diǎn)

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

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

?)

?????? 這個(gè)函數(shù)會(huì)產(chǎn)生一個(gè)視圖矩陣,并右乘到當(dāng)前矩陣上。模型變換通常發(fā)生在模型變換之前。其實(shí),視圖變換也是通過平移和旋轉(zhuǎn)得到的,觀察位置與物體位置之間是個(gè)相對(duì)的狀態(tài),我們也把視圖變換和模型變換統(tǒng)一成一個(gè)變換,產(chǎn)生一個(gè)矩陣:模型視圖變換矩陣。

?????? 2 、模型變換 (MODEL Transformation) :它確定模型的位置和方向,對(duì)模型進(jìn)行旋轉(zhuǎn)、平移和縮放。用到三個(gè)子函數(shù): glTranslate*(x, y, z) glRotate*(x, y, z) glScale*(x, y, z) 。每個(gè)函數(shù)都會(huì)產(chǎn)生一個(gè)矩陣,并右乘當(dāng)前矩陣。

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

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

這兩個(gè)函數(shù)的參數(shù)非常對(duì)稱,都是構(gòu)筑了一個(gè)六面體,形成可視范圍。它們都產(chǎn)生一個(gè)矩陣,并左乘當(dāng)前矩陣。(當(dāng)然,還有 glu 的兩個(gè)函數(shù))。

??????

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

?????? 用手工定義一個(gè)矩陣,如下(按 OpenGL 矩陣方式定義。與數(shù)學(xué)定義矩陣的方式轉(zhuǎn)置):

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

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

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

???????????????????? ?? a12, a13, a14, a15??? // 原點(diǎn)的位置

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

??????

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

我們來分析一個(gè)簡(jiǎn)單的例子: 

?

?

?1 #define ?NUM?0.70710678118654746
?2 // 注意這個(gè)矩陣是正交的,沒有正交就用,好像有放縮作用
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 );???????????????? //  原點(diǎn)的參考位置
25 ????glMultMatrixf(Tmatr1);???????????????? // 這個(gè)矩陣的動(dòng)作和下面的兩個(gè)變換是一樣的。
???????????????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 " );??? // 從這里看出,是先調(diào)用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

對(duì) glRotatef(45.0, 0.0, 0.0, 1.0)???

glTranslatef(3.0, 0.0, 0.0);  

這兩個(gè)變換,可以看成:

?????? glMultMatrixf(R);

?????? glMultMatrixf(T);

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

對(duì)模型變換的理解有兩種:

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

首先、對(duì)物體進(jìn)行平移,平移到坐標(biāo)( 3.0, 0.0, 0.0 )。  然后,把物體相對(duì)原點(diǎn)繞z軸旋轉(zhuǎn)45度。

2、物體捆綁在局部坐標(biāo)系下,所有的變換都是坐標(biāo)系進(jìn)行的。這時(shí),我們用順序來看這個(gè)變換。

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

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

最后在這個(gè)局部坐標(biāo)系 T 下畫了 Cube

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

?

?

后注:

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

?

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

評(píng)論

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

# re: OpenGL的視圖變換 2006-08-15 16:03 TH
@可冰
呵呵,OpenGL本身是沒有對(duì)窗口進(jìn)行處理能力的.需要借助GLUT庫,處理一些簡(jiǎn)單的窗口應(yīng)用.當(dāng)然處理能力可能不是很強(qiáng).
還有一個(gè)庫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.
**/
當(dāng)然還有很多很優(yōu)秀的GUI庫.如smartwin++,wxWidgets等.每種都有其不同的設(shè)計(jì)特點(diǎn).按需學(xué)習(xí)了~~~  回復(fù)  更多評(píng)論
  

# re: OpenGL的視圖變換 2006-09-08 00:49 嘿嘿
被這個(gè)冬冬搞的暈死了   回復(fù)  更多評(píng)論
  

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

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

模型變換是對(duì)坐標(biāo)系的變換!  回復(fù)  更多評(píng)論
  

# re: OpenGL的視圖變換 2007-03-31 20:06 hao a
hao a a a a   回復(fù)  更多評(píng)論
  

# re: OpenGL的視圖變換 2007-10-21 23:48 roger
好像有點(diǎn)小錯(cuò)誤,“它都蘊(yùn)含著一個(gè)局部坐標(biāo)系信息:以右邊坐標(biāo)系為參考坐標(biāo)系統(tǒng),左邊坐標(biāo)系的位置和方向。”
P=MP',設(shè)P是O系坐標(biāo),P'是O'系坐標(biāo), 那么,按照上述結(jié)論,以O(shè)‘系為參考,O坐標(biāo)系的描述為M。那么帶入P=MP',有:
I=MM

這是錯(cuò)誤的。

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

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

假設(shè)O‘系中有一個(gè)點(diǎn)(3,0,0,1)‘,那么,O系中,它在:
M*P‘=(6,0,0,0)  回復(fù)  更多評(píng)論
  

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


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品视频免费一区| 这里只有精品视频| 亚洲一区www| 亚洲免费观看高清在线观看| 在线观看精品一区| 亚洲高清不卡av| 亚洲激情电影中文字幕| 亚洲精品国产精品国自产观看浪潮| 亚洲高清一区二区三区| 亚洲美女在线视频| 亚洲免费在线视频| 久久精品网址| 亚洲成色www8888| 亚洲国产精品www| 亚洲视频精选| 久久精品国产一区二区三| 开心色5月久久精品| 欧美激情亚洲国产| 国产欧美日韩视频一区二区| 伊人婷婷久久| 亚洲桃花岛网站| 久久久蜜桃一区二区人| 亚洲国产精品高清久久久| 一区二区三区日韩欧美精品| 欧美一站二站| 欧美人妖在线观看| 国产一级一区二区| 国产欧美三级| 欧美中文字幕久久| 欧美夫妇交换俱乐部在线观看| 亚洲精品自在久久| 久久久久综合网| 欧美午夜欧美| 亚洲激情一区| 久久久久久婷| 亚洲视频综合在线| 欧美国产亚洲另类动漫| 国产日韩欧美一区二区| 日韩一级大片| 欧美承认网站| 欧美中文字幕在线观看| 欧美视频1区| 亚洲卡通欧美制服中文| 久久视频一区二区| 亚洲一区二区成人在线观看| 欧美成人高清| 一区二区三区在线免费观看| 午夜精品久久久久久久| 亚洲精品偷拍| 欧美成人综合| 亚洲黄色一区| 欧美高清在线观看| 久久深夜福利免费观看| 国产一区自拍视频| 久久都是精品| 亚洲欧美一区二区精品久久久| 欧美日韩在线免费观看| 亚洲乱码一区二区| 欧美黄色免费网站| 久久青青草原一区二区| 国产一级久久| 久久香蕉国产线看观看网| 香蕉久久一区二区不卡无毒影院 | 国产精品成人免费| 99爱精品视频| 日韩一区二区精品| 欧美视频中文在线看| 亚洲天堂成人在线视频| 一区二区国产日产| 国产精品乱人伦中文| 欧美影院成年免费版| 亚洲欧美综合网| 国产日韩欧美亚洲一区| 久久久免费精品视频| 久久琪琪电影院| 亚洲国产日韩欧美在线99| 亚洲高清在线| 欧美日韩亚洲免费| 欧美在线一区二区三区| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲狠狠婷婷| 中文日韩在线| 狠狠色香婷婷久久亚洲精品| 麻豆久久久9性大片| 欧美1区2区视频| 欧美波霸影院| 国产美女精品| 欧美va亚洲va日韩∨a综合色| 另类春色校园亚洲| aaa亚洲精品一二三区| 亚洲深夜福利| 亚洲电影免费观看高清完整版在线| 欧美电影免费观看高清完整版| 欧美精品一区二区精品网| 亚洲自拍另类| 美女91精品| 欧美一级淫片播放口| 免费成人黄色| 久久99在线观看| 欧美精品在线观看一区二区| 久久国产精品一区二区三区四区 | 99国产精品久久久久老师 | 欧美日韩亚洲国产精品| 久久久久91| 欧美日韩视频专区在线播放| 久久久国产午夜精品| 欧美日韩第一页| 久久午夜av| 国产精品区一区二区三| 亚洲高清不卡一区| 国产亚洲成年网址在线观看| 亚洲日本一区二区三区| 狠狠做深爱婷婷久久综合一区 | 亚洲精品一区二区三区四区高清 | 欧美日韩在线观看视频| 男人天堂欧美日韩| 国产一区二区三区的电影| 一本久道综合久久精品| 亚洲清纯自拍| 老司机午夜精品视频| 久久久久久欧美| 国产伦精品一区二区| 夜夜狂射影院欧美极品| 亚洲精品国产日韩| 久久亚洲精品欧美| 久久久久久久久久久久久女国产乱| 欧美日韩中文在线| 亚洲精品国久久99热| 最新热久久免费视频| 久久久久成人网| 久久久蜜桃精品| 国模一区二区三区| 久久精品人人爽| 久久色中文字幕| 狠狠做深爱婷婷久久综合一区| 欧美一区二区久久久| 久久国产精品99国产| 国产日韩亚洲欧美精品| 午夜精品视频在线观看| 久久大香伊蕉在人线观看热2| 国产日韩在线看| 欧美在线短视频| 久久综合久久综合久久综合| 国语自产精品视频在线看| 91久久中文| 99在线精品视频在线观看| 一本久久综合亚洲鲁鲁五月天| 欧美激情亚洲另类| 99re8这里有精品热视频免费| 99国产麻豆精品| 欧美日韩一区二区三区在线看| 99国产精品| 午夜视频在线观看一区| 国产精品午夜久久| 久久福利一区| 欧美激情偷拍| 亚洲一级影院| 国产网站欧美日韩免费精品在线观看 | 亚洲激情中文1区| 中文av一区二区| 国产精品一二三视频| 久久av一区| 亚洲国产免费| 午夜欧美大片免费观看| 激情成人在线视频| 欧美日本视频在线| 午夜精品国产更新| 欧美福利精品| 午夜老司机精品| 亚洲黄色尤物视频| 国产精品入口66mio| 另类成人小视频在线| 亚洲影院色无极综合| 欧美成人精品一区二区三区| 在线视频亚洲一区| 狠狠色2019综合网| 欧美日韩在线免费观看| 久久精品一级爱片| 一区二区三区免费看| 免费久久精品视频| 亚洲欧美中文在线视频| 亚洲第一天堂无码专区| 国产精品高清免费在线观看| 久久综合影视| 性伦欧美刺激片在线观看| 亚洲人成网站色ww在线| 久久一区二区三区国产精品| 亚洲免费网址| 一区二区三区日韩欧美精品| 亚洲大胆女人| 国产一区二区三区在线观看视频 | 在线观看日韩av电影| 国产精品va在线播放| 免费成人美女女| 久久精品视频在线看| 亚洲午夜91| 亚洲最新中文字幕| 亚洲欧洲在线免费| 亚洲高清视频在线观看| 久久影视三级福利片|