圖形學復習知識點2

二維幾何變換(待補)

  1. 平移

二維觀察流水線

二維觀察流水線.PNG

C代表coordinate
建模坐標系-> 世界坐標系-> 觀察坐標系->設備坐標系


裁剪

點的裁剪

直接判斷是否在窗口內部即可

直線段的裁剪

基本思想:對每條直線段p1(x1,y1) p2(x2,y2)分三種情況處理:
(1) 直線段完全可見,“取”之。
(2) 直線段顯然不可見,“棄”之。
(3) 直線段既不滿足“取”的條件,也不滿足“棄”的條件,需要對直線段按交點進行分段,分段后重復上述處理。

編碼:對于任一端點(x,y),根據其坐標所在的區域,賦予一個4位的二進制碼D3D2D1D0。
編碼規則如下:
若x<xL,則D0=1,否則D0=0;
若x>xR,則D1=1,否則D1=0;
若y<yB,則D2=1,否則D2=0;
若y>yT,則D3=1,否則D3=0。

編碼.PNG

裁剪一條線段時,先求出端點p1和p2的編碼code1和code2:
(1)若code1 | code2 = 0,對直線段應取之
(2)若code1 & code2 != 0,對直線段可棄之
(3)若上述兩條件均不成立。則需求出直線段與窗口邊界的交點。在交點處把線段一分為二,其中必有一段完全在窗口外,可以棄之。再對另一段重復進行上述處理,直到該線段完全被舍棄或者找到位于窗口內的一段線段為止。

(1) 輸入直線段的兩端點坐標:p1(x1, y1)、p2(x2, y2),以及窗口的四條邊界坐標:yT、yB、xL和xR。
(2) 對p1、p2進行編碼:點p1的編碼為code1,點p2的編碼為code2。
(3) 若code1 | code2=0,對直線段應簡取之,轉(6);
否則,若code1 & code2 != 0,對直線段可簡棄之,轉(7);當上述兩條均不滿足時,進行步驟(4)。
(4) 確保p1在窗口外部:若p1在窗口內,則交換p1和p2的坐標值和編碼。
(5) 按左、右、上、下的順序求出直線段與窗口邊界的交點,并用該交點的坐標值替換p1的坐標值。也即在交點s處把線段一分為二,并去掉p1s這一段。考慮到p1是窗口外的一點,因此可以去掉p1s, 轉(2)
(6) 用直線掃描轉換算法繪制當前的直線段p1p2。
(7) 算法結束。


三維觀察流水線

三維觀察流水線.PNG
三維觀察流水線2.PNG

觀察變換

變換過程:

  1. 原點到視點的平移變換
  2. 繞z1軸的旋轉變換
  3. 繞x2軸的旋轉變換
  4. 關于y3O3z3面的反射變換



投影變換

平行投影: 正投影 斜投影

正投影&&斜投影.PNG

正投影:三視圖 && 正軸測圖

主視圖

俯視圖.PNG

正軸測投影.PNG

透視投影
透視投影.PNG
一點透視

二點透視.PNG
三點透視.PNG

三維實體表示基礎

:最基本的零維幾何元素 (x,y,z)
:一維幾何元素 一條邊由兩個端點表示 折現一般用頂點序列來表示
:二維幾何元素
:由有向邊順序組成的面的邊界
:三維幾何元素,由封閉的表面圍成的空間。

幾何信息:用來描述物體的位置和大小
拓撲信息:用來描述點,棱邊及面片之間的鄰接關系,具體表現為棱邊及面片的數據結構。

一個有效的實體有如下性質

  1. 剛性
  2. 具有封閉的邊界
  3. 內部連通
  4. 占據有限的空間
  5. 經過集合運算后仍然是有效的實體

實體模型是最完善的模型定義,它能夠表達全部的形狀信息,如物體位置、面積、長度、體積、拓撲關聯等,同時也定義了物體的并、交、差集合運算和歐拉運算等。


三維實體表示方法

邊界表示

通過描述實體的邊界來表示實體。

判斷實體是否合法: 邊界的每條鄰邊必須要有兩個已知坐標的端點。 每條邊只能被兩個面共享。 每個頂點至少被三個面或三個邊共享。

優點:能顯式地表示形體邊界,繪制時能快速計算法向和光照效果,算法簡單。 便于局部幾何變換。 便于多個形體做并,交,差運算。 可利用歐拉公式來判斷有效正則性。

歐拉公式 V-E+F = 2 V頂點數,E邊數,F面數。(對于簡單多面體)

非簡單多面體 V-E + F- H = 2(C- G) H形體表面的孔數 G 穿透多面體的洞數 C 獨立不相連的多面體數

常用的數據結構

class Point
{
    int id;  //頂點編號,有時可以不要該成員
    int x;   //橫坐標
    int y;   //縱坐標
}
vector<Point> Points;  //存放Point對象的動態數組

class Edge
{
    int edge_id;    //邊的編號,有時可以不要該成員
    int BeginPoint; 
    //為指向Points數組中對應邊的起點的元素的索引
    int EndPoint; 
    //為指向Points數組中對應邊的終點的元素的索引
    int LeftFacet; 
    //為指向Facets數組中對應此邊左側鄰面的元素索引
    int RightFacet; 
   //為指向Facets數組中對應此邊右側鄰面的元素索引
}
vector<Edge> Edges;  //存放Edge對象的動態數組

class Facet
{
    vector<int> vertices;  //該面片邊界頂點序列數組,               // 其元素值為指向Points數組的指針
    vector<int> edges;     //該面片各邊的數組,
                // 其元素值為指向Edges數組的指針
}
vector<Facet> Facets;//存放Facet對象的動態數組

翼邊數據結構:以邊為核心,每條邊記錄中設置指向其兩個頂點,左右兩個鄰面,上下左右四條鄰邊的指針。每個頂點的記錄都指向以它作為端點的一條表。每個面的記錄指向其一條邊的指針。

翼邊數據結構.PNG

對稱數據結構:存放了面→邊、邊→面、邊→點、點→邊的4種拓撲關系,每個面記錄中設置了指向它所有邊的指針,同樣,每條邊記錄中也設置了指向它兩個鄰面的指針和兩個頂點的指針,每個點設置以它為端點的所有邊的指針。這種數據結構的空間復雜度為6E,E為實體中的邊數。

半邊數據結構:一條邊被表示成拓撲意義下的方向相反的兩條半邊。實體由多邊形(面)的組合來表示,而多邊形由外環及內環組合而成,環又是半邊構成的序列,每條半邊又由兩個頂點構成。

掃描表示

平移掃描:物體沿著某一直線方向平移一段距離
旋轉掃描:物體圍繞某一軸線旋轉一定距離
廣義掃描:物體沿著某一空間曲線掃描一定距離

構造實體幾何表示

基本思想:將簡單實體通過集合運算組合成所需要的物體。
CSG(Constructive Solid Gemetry)
采用單一的建筑塊形式的構造實體造型方法,由兩個物體的正則幾何操作生成新的物體。(并,交,差)

CSG法:集合運算的實現過程用一顆二叉樹來描述。
二叉樹葉子節點表示體素或者集合變換的參數。
非終端節點表示施加于其子節點上的實體集合運算或幾何變換。
根節點表示的就是集合運算的最終結果。

優點: 覆蓋域廣泛,輸入方便,可直觀地構造復雜圖形。數據結構簡單,數據量小,用一顆二叉樹即可表示。 形體的有效性可由實體集合運算保證。
缺點:體素很多都是由參數和表面方程表示的,用表面方程和參數表示易于求交點,方便了集合運算,但運算后的中間結果很難用方程和參數表示,后面的集合運算難度較大。解決方案:將中間結果轉化為邊界表示。
集合運算會破壞原有的點邊面的顯示拓撲關系。
體素的形狀有限。體素不能進行局部變形操作,CSG的表現能力有限制。

空間細分表示法

體素表示法,八叉樹表示法

體素表示法:實體占有的空間被劃分成均勻的小立方體,小立方體構成三維矩陣,小立方體即為體素。用體素表示的空間成為三維位圖。

*體素表示法常用于物體的CT或MRI圖像的三維重建。
八叉樹表示法.PNG
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容