視圖和模型變換

視圖變換,是指變換照相機的位置,角度。
模型變換,是指變換被照物體的位置,角度。

這兩個變換,都會影響最終圖形中,物體的位置,角度。而這兩個變換,可以達到相同的效果。比如,你想要一個倒著的水杯圖形,可以把你自己倒立,這樣看到的水杯就是倒立的了。或者把水杯倒立,自己直立,也能看到倒立的水杯。
這里寫圖片描述
如圖所示,這兩種變換,可以看做達到目的的不同途徑。甚至可以同時使用視圖變換和模型變換,只要最終拿到了我們想要的圖像就可以了。至于使用的是視圖變換,還是模型變換,看我們理解問題的角度。

3.2.1 對變換進行思考

變換順序,對最終的結果影響很大。
看下面的例子:
這里寫圖片描述
圖中有兩個操作,旋轉和移動。一個是沿原點繞z軸逆時針旋轉45度,另一個是沿x軸向下平移。左圖中,是先旋轉,再移動,物體最終在x軸上。右圖中,是先移動,再旋轉,物體最終在x=y軸上。變換順序不同,導致物體最終位置不同,這就是變換順序的影響。

變換順序,在OpenGL中的具體實現。
在OpenGL中,所有的變換,都是通過矩陣來實現的。一個矩陣,表示一個或多個變換。模型視圖變換,是通過模型視圖矩陣來實現的。由于這個矩陣經常變換,需要進行管理,OpenGL中是通過矩陣堆棧來對矩陣進行管理的。

當前模型視圖矩陣如果用C來表示,在當前模型視圖基礎上,進行一個變換,這個變換使用的矩陣為M。那么一個頂點v的變換之后的坐標為CMv。也就是說,M變換先作用于頂點v,然后再是當前模型視圖矩陣C。

看下面的例子:

glMatrixMode(GL_MODELVIEW);
glLoadIndentity();
glMultMatrixf(N);       //變換N
glMultMatrixf(M); //變換M glMultMatrixf(L); //變換L glBegin(GL_POINTS); glVertex3f(v); glEnd();
?

這段代碼中,模型視圖矩陣按順序分別包含了I, N, NM,最后是NML,其中I表示單位矩陣。經過變換的頂點是NMLv。因此,頂點變換就是N(M(Lv)),也就是說,v首先與L相乘,Lv再與M相乘,MLv再與N相乘,而不是按它們指定的順序出現的。

全局固定坐標系

圖3-4中,左圖中的先旋轉,再平移,代碼實現如下:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(T);   //平移
glMultMatrixf(R); //旋轉 draw_the_object();

只要記住一點,物體的變換順序,和矩陣的出現順序,正好相反。

局部移動坐標系統

這個通常用于模型的關節控制。比如機器人手臂。比如畫汽車輪子上的螺釘,這個螺釘的位置,相對于汽車輪子,這個輪子上建立的坐標系,叫局部移動坐標系。而輪子的位置,又是相對于汽車本身,最后,汽車本身,是在全局坐標系中指定。

3.2.2 模型變換

模型變換,主要涉及三個函數,移動、旋轉、縮放。有了這三個函數的組合,我們可以進行任意變換。

void glTranslate{fd}(TYPE x, TYPE y, TYPE z);
void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z); void glScale{fd}(TYPE x, TYPE y, TYPE z);
這三個函數,之前接觸過。glTranslate,進行平移,平移的偏移量,由(x, y, z)指定。 glRotate,旋轉,以逆時針方向繞著從原點到點(x, y, z)的直線旋轉角度angle。glScale,按照一定比列進行縮放,比例在x軸,y軸,z軸方向上的量是(x, y, z)。

3.2.3 視圖變換

視圖變換,相關的三個函數是glTranslate,glRotate和gluLookAt函數。

這個glTranslate和glRotate在模型變換中,我們已經見過了。怎么模型變換和視圖變換,使用的是同樣的函數呢?因為變換是相對的。 比如,讓模型和照相機距離5個單位長度,假設模型和照相機放在一起。我們可以將物體向前移動5個單位長度,也可以將照相機向后移動5個單位長度。所以,視 圖變換,也是使用glTranslate和glRotate。只是這個參數的含義相反罷了。
比如

glTranslatef(0.0, 0.0, -5.0);

這個函數在場景中把物體沿z軸移動-5個單位,相當于把照相機沿z軸移動+5個單位。

使用工具函數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參數表示哪個方向是朝上的(也就是說,在視景體中自底向上的方向)。

默認情況下,照相機位于原點,指向z軸的負方向,以y軸的正方向為朝上方向。相當于調用:

gluLookAt(0.0, 0.0, 0.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0);
參考點的z值是-100.0, 但它也可以是任意的負值,因為它不會影響視線的方向。

下面是使用gluLookAt的一個例子。

gluLookAt(4.0, 2.0, 1.0, 2.0, 4.0, -3.0, 2.0, 2.0, -1.0);

這里寫圖片描述
這個函數,將攝像機移動到了(4.0, 2.0, 1.0)這個點,攝像機朝向(2.0, 4.0, -3.0)方向,攝像機向上的方向為(2.0, 2.0, -1.0)。

強烈推薦,理解這幾個函數(glTranslate, glRotate, gluLookAt),使用Nate Robin的教程。網上有下的。

創建自定義的工具函數

創建自定義的函數,其實就是在自己的函數中,調用glTranslate和glRotate這兩個函數。
要創建自定義的工具函數,主要是弄清楚兩個東西:一個是參數是相對于哪個坐標系的,第二個就是照相機的變換順序,與glTranslate,glRotate出現的順序相同。

比如編寫一個飛機模擬器,并且以飛機的駕駛員座位觀察點顯示飛機外面的景象。我們可以用一個圓點位于跑道上的坐標系統來描述整個場景,飛機相對于坐 標(x, y, z)。然后,假設飛機還有傾側角、螺旋角和航向改變角(這些都是飛機相對于它的重心的旋轉角度)。下面這個函數可以作用視圖變換函數使用。

void pilotView(GLdouble planex, GLdouble planey, GLdouble planez, GLdouble roll, GLdouble pitch, GLdouble heading)
{glRotated(roll, 0.0, 0.0, 1.0); glRotated(pitch, 0.0, 1.0, 0.0); glRotated(heading, 1.0, 0.0, 0.0); glTranslated(-planex, -planey, -planez); }
這個其實很好理解,因為這個roll, pitch, heading,都是相對于飛機的。而飛機,就是我們的相機。所以,先將飛機旋轉到一定角度,然后移動到點(planex, planey, planez)上面。因為這個planex, planey, planez是相對于機場跑道的坐標系,而我們移動的飛機相當于相機,所以都要取負號。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397833.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397833.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

phoenix的元數據一般存在哪里_Phoenix的一些問題

date: 2020-09-10 13:50:00updated: 2020-09-14 16:30:001. Phoenix索引全局索引:適合讀多寫少的場景。寫數據時因為索引表分布在不同數據節點,跨節點數據傳輸帶來巨大的性能消耗。全局索引必須是查詢語句中所有列都包含在全局索引中,它才會生…

鴻蒙os全面升級,華為突然宣布,鴻蒙OS正式版6月底全面升級,幸福來得太突然...

原標題:華為突然宣布,鴻蒙OS正式版6月底全面升級,幸福來得太突然摘要:早在今年2月華為Mate X2折疊屏新品發布會上,余承東曾表示,鴻蒙OS正式版將于今年4月份全面上線。或許是因為華為宣布賣車分散了很多的精…

5-python學習——條件語句

5-python學習——條件語句 5-python學習——條件語句 條件語句if else形式if else條件語句說明 測試一下編程語言一般都由這么幾個部分組成 變量條件分支語句循環語句函數這里要說的就是條件分支語句。 python的條件語句和shell腳本的非常像,也就是if else if else這…

eclipse啟動失敗:An internal error occurred during: reload maven project

2019獨角獸企業重金招聘Python工程師標準>>> 1.找到workspace文件夾下的/.metadata文件夾,將其刪除掉,然后在講項目重新導入進去eclipse中。但是這個有一點不好的地方,之前對eclipse所做的配置也會恢復為默認配置 2.在.metadata下…

Quartz2D知識點聚合案例

Quartz2D知識點聚合 基本 //畫圖片UIImage *image [UIImage imageNamed:"阿貍頭像"];[image drawInRect:rect];//字體NSString *title "標題";NSMutableDictionary *atr [NSMutableDictionary dictionary];atr[NSFontAttributeName] [UIFont systemFon…

skt7850鴻蒙策略,lol 英雄聯盟 SKT狀態回暖輕取外卡,SUP難擋Faker

MSI 第四日 SUP vs SKT雙方bpBAN LISTBAN:SUP:流浪 牛頭 豹女SKT:巴德 妖姬 魚人PICKSUP:大樹 男槍 冰女 盧錫安 錘石SKT:艾克 千玨 沙皇 EZ 布隆比賽開始,雙方正常對線開局。前期下路錘石多次勾中ez,男槍也來逼出EZ布…

spring集成struts2

Struts2前身是WebWork,核心并沒有改變,其實就是把WebWork改名為struts2,與Struts1一點關系沒有。 Struts2中通過ObjectFactory接口實現創建及獲取Action實例,類似于Spring的IoC容器,所以Action實例可以由ObjectFactory…

slqite3庫查詢數據處理方式_SQLite3命令操作大全

SQLite3命令操作大全SQLite庫包含一個名字叫做sqlite3的命令行,它可以讓用戶手工輸入并執行面向SQLite數據庫的SQL命令。本文檔提供一個樣使用sqlite3的簡要說明.一.qlite3一些常用Sql語句操作創建表: create table 表名(元素名 類型,…);刪除表: drop …

Android學習之查看網絡圖片

在這里小編學習了查看網絡圖片的小案例,: 初始界面: 點擊瀏覽后,效果如下: 需要注意的是 該案例需要獲取聯網權限,即: <uses-permission android:name"android.permission.INTERNET"/>具體步驟如下: 1.定義并初始化控件: private EditText etImageUrl;private …

AutoLayout 淺析動畫

1.AutoLayout相關的幾個易混淆的方法 setNeedsLayout layoutIfNeeded layoutSubViews setNeedsUpdateConstraints updateConstraitsIfNeed updateConstraints 子視圖在界面上的顯示大概經過了&#xff1a;更新約束-通過約束依賴關系得到具體的frame-展示到界面。上面幾個是和au…

vue 轉為靜態html,Vue CLI 3使用:HTML和靜態資源(五)

HTMLpublic/index.html 文件是一個會被 html-webpack-plugin 處理的模板。構建中&#xff0c;各種資源路徑會被注入解析。可以使用 lodash template 語法插入內容。用來做不轉義插值&#xff1b;用來做 HTML 轉義插值&#xff1b;用來描述 JavaScript 流程控制。除了被 html-we…

animate css3 應用的借鑒,一個同事寫的JS

$("#banner").height($(window).height()-125);$(window).resize(function(){ $("#banner").height($(window).height()-125);}); //首頁幻燈$(".indeximgs:first").show();var i0;$(".leftbut").click(function(){$(".indexim…

從html導出帶樣式的excel,Jquery導出帶樣式的Excel

工作中做導出的時候&#xff0c;需要導出自定義的表格或嫌棄導出的Excel格式太難看了。需要設置顏色、字號大小、加粗、合并單元格等等。特性&#xff1a;支持過濾 某個位置支持過濾 img 標簽支持過濾 a 標簽支持過濾 input 標簽支持包含 行內樣式。HTML頁面&#xff1a;HTML頁…

elementui from表單提交_elementui upload與form一起提交

學生基本信息管理操作中&#xff0c;有照片&#xff0c;可以上傳也可以不上傳&#xff0c;在表單界面可以修改照片&#xff0c;el-upload控件可以帶額外參數提交&#xff0c;jquery的post模擬不了成表單帶文件提交的方式&#xff0c;因此&#xff0c;判斷如果有上傳文件時&…

information_schema.character_sets 學習

information_schema.character_sets 表用于查看字符集的詳細信息 1、character_sets 常用列說明&#xff1a; 1、character_set_name&#xff1a;    字符集名 2、default_collate_name&#xff1a;    默認排序規則   3、description&#xff1a;         …

asp.net mvc 用Redis實現分布式集群共享Session。

1、這兩天研究Redis搞分布式session問題&#xff0c;網上找的資料都是用ServiceStack.Redis來實現的&#xff0c;但是在做性能測試的時候發現最新的v4版本有限制每小時候最多請求6000次&#xff0c;因為官網開始商業化要收費了&#xff0c;好坑爹的說&#xff0c;還好我前期弄了…

如何用計算機求和,求和計算器

求和計算器您可以使用此求和計算器快速計算預定范圍內某個表達式的序列之和。如何使用求和計算器輸入總和的表達式輸入上限和下限提供表達式中使用的變量的詳細信息單擊“計算”按鈕生成結果。求和Σ符號計算器k ∑n 0變量:nixyzabc 103740支持的運算符常量和函數算術運算符加“…

Zookeeper概述、特點、數據模型

Zookeeper1.Zookeeper概述Zookeeper是一個工具&#xff0c;可以實現集群中的分布式協調服務。所謂的分布式協調服務&#xff0c;就是在集群的節點中進行可靠的消息傳遞&#xff0c;來協調集群的工作。Zookeeper之所以能夠實現分布式協調服務&#xff0c;靠的就是它能夠保證分布…

云計算機創意名,有創意的道路名字推薦,分享一些好聽有內涵的路名

提到龍崗板塊&#xff0c;“風向”一直飄忽不定。原本地鐵4號線今年通車&#xff0c;但是因為五象火車站的規劃建設&#xff0c;暫時未開通;機場線已經敲定&#xff0c;然而沒有龍崗的份…… [本文來自&#xff1a;www.777y.com]雖然機場線暫時無緣(可以期待下)&#xff0c;但是…

250W電源帶i7+GTX1080?

電源的科學: Q1&#xff1a;電源的額定功率是什么&#xff1f;峰值功率又是什么&#xff1f;A1&#xff1a;電源的額定功率就是電源正常工作時的功率&#xff0c;它的值為用電器的額定電壓乘以額定電流。而峰值功率指的是電源短時間內能達到的最大功率&#xff0c; 一般情況下電…