裁剪區視見區和物理視窗的關係

2021-06-26 20:05:20 字數 1757 閱讀 8147

看紅寶書的前幾章,有乙個函式一直不明白是什麼意思,做什麼用的:glortho,只知道在視窗大小變化的時候呼叫的,如果沒有這個,繪製的圖形將會變形。至於為什麼會變形,一直沒有搞明白。就是知道會變形,但是不知道會變成什麼樣子。

後來再次看前幾章的內容,重新看了關於裁剪區和視見區的內容,才若有所悟,書讀三遍,其義自現。這句話還是有道理的。

裁剪區:

視窗在物理上是以畫素數來測量的。開始在視窗中畫點、線或圖形之前,必須告訴opengl如何把指定的座標對轉換成螢幕座標。為了做到這一點,先指定視窗在笛卡爾空間中佔據的區域,這一區域稱為「裁剪區」。在二維空間中,裁剪區是視窗內最小和最大的x值和y值。另乙個方法是指定原點相對於視窗的位置。如下圖所示:

視見區:

以畫素計算的話,裁剪區的寬度和高度很少會恰好與視窗的寬度和高度一致。所以座標系必須以邏輯笛卡爾座標對映為物理螢幕的畫素座標。這種對映是由稱為」視見區「的設定指定的。視見區是視窗的客戶區用於繪製裁剪區的區域。視見區只是把裁剪區對映為視窗的乙個區域。通常把視見區定義為整個視窗,但是有時候只想在視窗的下半部分繪圖。

如下圖所示,物理視窗大小為300×200畫素,其視見區定義為整個視窗區域,即300×200.如果把這個視窗的裁剪區設定為x軸上的0-150和y軸上的0-100,那麼邏輯座標就應該對映為可見視窗中乙個較大的螢幕座標系:即這個邏輯座標系的乙個單位增量對應於該視窗物理座標系統中的兩個單位增量,即兩個畫素。

如果,保持上圖中的物理視窗大小不變,將視見區的大小設定為裁剪區大小,即150×100,則可見區域只佔該物理視窗的左下部分,如下圖所示:

所以,你可以用視見區來縮小或者放大視窗內的影象,把視見區設定的比視窗的客戶區還大,就可以在整個物理視窗只顯示一部分裁剪區,這裡自動腦補。

這個時候問題來了(不是挖掘機技術哪家強),如果我們在渲染的時候,變化物理視窗的大小,比如拉大或者縮小。這個時候,如果視見區不變的話,那麼裁剪區內的影象將會產生變形,想一想,視見區大小不變,但是物理視窗大小變了,邏輯座標系的乙個單位對應物理視窗的單位多少也變了,這樣在邏輯座標系中的正方形就不是正方形了,圓也不是正圓了。如下圖,邏輯座標系裁剪區大小還是150×100,位於裁剪區中間有乙個矩形,但是視見區的大小不變(相對於以上兩個圖形),還是300×200,注意這時物理視窗由於某些因素已經變化了,這個時候的對應關係就變成了:

視見區:300×200,裁剪區:150×100,物理視窗實際大小:300×400(下圖),那麼中間的矩形(圖中沒有標出,在座標系內部)大小為75×50。

x方向對映到物理視窗大小:

75*(300*/150)*(300/300) = 150;

y方向對映到物理視窗大小:

50*(200/100)*(400*200) = 200;

看到產生什麼變化了吧,矩形的形狀變了(寬高比),這樣圖形就產生了形變。

所以,我們看到,視見區其實相當於乙個中介或者媒介,用於正確地將邏輯座標系轉換到物理座標系。

所以,一旦當視窗大小發生變化時,視見區的大小要重新定義。opengl裡的glortho,具體用法先不說了,網上有很多資料。

編碼區和非編碼區的關係

所有的基因都會呈現時間和空間的關係!編碼區是細胞dna的一部分,我們知道,基因分為 編碼區,非編碼區。編碼區是指能夠轉錄信使rna的部分,它能夠合成相應的蛋白質,而非編碼區是不能夠轉錄信使rna的dna結構。但是它能夠調控遺傳資訊的表達。真核生物的基因組成是編碼區和非編碼區,其中編碼區是由外顯子和內...

Git 工作區 暫存區和版本庫的關係

先從概念上分析工作區 暫存區和版本庫 工作區 就是你在電腦裡能看到的目錄。暫存區 英文叫stage 或index 一般存放在 git目錄下 下的index檔案 git index 中,所以我們有時把暫存區也叫作索引 index 版本庫 工作區有乙個隱藏目錄.git,這個不算工作區,而是 git 的版...

Flex,Flash,AS3,AIR的關係和區別

flex,flash,as3,air的關係和區別 本文詳細介紹了 flash flex as3 air 的關係和區別。希望對初學者有幫助。as3flash flash 是用來生成 swf 檔案的創作工具,做動畫比較方便,可以在fla檔案內部寫as3 也可以在fla外部寫as3 flash 內建 as...