網(wǎng)架加工安裝一體的公司外鏈seo
坐標(biāo)轉(zhuǎn)換
文章目錄
- 坐標(biāo)轉(zhuǎn)換
- 坐標(biāo)系統(tǒng)的轉(zhuǎn)換
- 局部空間(Local Space)->世界空間(World Space)
- 世界空間(World Space)->觀察空間(View Space/View Space)
- 裁剪空間(Clip Space)
- MVP矩陣
坐標(biāo)系統(tǒng)的轉(zhuǎn)換
了解坐標(biāo)系統(tǒng)和空間變換之前需要先了解一下線性代數(shù)。
其實(shí)空間轉(zhuǎn)換就是相同頂點(diǎn)在不同坐標(biāo)系下新的坐標(biāo),最后在著色器里完成
渲染。
局部空間(Local Space)->世界空間(World Space)
個人理解:使用model矩陣轉(zhuǎn)換坐標(biāo)系
- 只是用平移,放縮和旋轉(zhuǎn)矩陣實(shí)現(xiàn)轉(zhuǎn)化,把局部坐標(biāo)(頂點(diǎn)坐標(biāo))通過模型原點(diǎn)和世界坐標(biāo)原點(diǎn)獲得各頂點(diǎn)的世界坐標(biāo)。
- 換個理解方式,就是將局部空間的原點(diǎn)坐標(biāo)通過矩陣變換放置到世界空間的原點(diǎn)坐標(biāo)
- 注意要先線性變換再平移(縮放 -> 旋轉(zhuǎn) -> 平移)
model矩陣:
此代碼只是旋轉(zhuǎn)了每個頂點(diǎn),因?yàn)楫?dāng)前的渲染的物體的原點(diǎn)坐標(biāo)已經(jīng)在世界原點(diǎn),故此時(shí)的model矩陣可以直接為單位陣
//Learnopengl 代碼
glm::mat4 model;
model = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));
世界空間(World Space)->觀察空間(View Space/View Space)
個人理解:使用view矩陣轉(zhuǎn)換坐標(biāo)系
- OpenGL本身沒有攝像機(jī)(Camera)的概念,攝像機(jī)的移動就是物體的反方向移動。
- 其坐標(biāo)轉(zhuǎn)換就是從頂點(diǎn)世界坐標(biāo)轉(zhuǎn)化到以攝像機(jī)的視角作為場景原點(diǎn)時(shí)的新的坐標(biāo)
- 我們只需要考慮設(shè)置攝像機(jī)的位置、攝像機(jī)的朝向(方向),但僅僅這兩個變量無法確定一個坐標(biāo)系,我們需要引入上向量(垂直與位置和方向構(gòu)成的方向向量),此時(shí)根據(jù)向量的叉乘,我們就可以確定一個新的坐標(biāo)系。
- 叉乘的結(jié)果方向和叉乘的順序有關(guān),可以根據(jù)右手定則確定,注意OpenGL里是右手坐標(biāo)系。
lookAt函數(shù)
- 第一個變量:這是你在空間中的位置,你希望從這個位置看向
center
。 - 第二個變量: 是你希望看向的位置,通常這個位置是場景中的某一點(diǎn)。
- 第三個變量:是定義相機(jī)的上向量的方向。這個向量垂直于視線(從眼睛到目標(biāo))和水平向量。
glm::mat4 view;
view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
裁剪空間(Clip Space)
簡單來說就是看不到的就不渲染。
兩種投影矩陣
- 矩陣要做什么:將頂點(diǎn)坐標(biāo)”壓縮進(jìn)“[-1,1]的范圍,越界則被裁剪掉
- 正交(Orthographic )
- 無近大遠(yuǎn)小
- 矩陣怎么得到的:試想正交投影就是一個類似立方體的平截頭箱,其先平移再修改scale,就能得到一個轉(zhuǎn)成成標(biāo)準(zhǔn)化設(shè)備坐標(biāo)(Normalized Device Coordinate, NDC)的矩陣
- 透視(Perspective)
- 實(shí)現(xiàn)的效果為近大遠(yuǎn)小,那么只需要將遠(yuǎn)平面壓縮成和近平面一樣,由于其類似于一個錐體,側(cè)面看是一個三角形,它們是存在相似的關(guān)系,Z軸上,XY成比例,我們需要將每個坐標(biāo)壓縮,然后左乘正交矩陣就可以得到
- projection = orthographicMatrix * projectiveMatrix * projection;
用glm庫直接獲取:
//正交,參數(shù)就是設(shè)置了一個立方體
glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);
//透視
//注意不同版本的glm是否需要使用過glm::radians函數(shù)的問題
glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)width/(float)height, 0.1f, 100.0f);
MVP矩陣
在著色器里按順序左乘各個矩陣即可
gl_Position = projection * view * model * aPos;