原 3D中的座標變換(一)

2021-08-29 10:37:20 字數 1590 閱讀 8450

相機變換:

1.建立乙個尤拉相機模型的過程:

i: 計算出相機的平移矩陣(根據相機位置計算平移矩陣的逆矩陣)。

ii: 根據相機沿各個座標軸的變化角度,計算一下各座標軸的尤拉角度。

iii: 然後建立各座標軸的旋轉的逆矩陣。左後根據座標軸的變換順序,如:xyz、yxz、xzy、yzx、zyx等旋轉順序,產生乙個計算好的旋轉矩陣(個座標軸的旋轉矩陣相乘)。

iv: 把平移矩陣和旋轉矩陣相乘,得到最終的尤拉相機變換矩陣。

2.建立乙個uvn相機模型的過程:

i: 根據相機位置計算出平移逆矩陣;

ii: 確定出方向點的座標;

iv: 建立乙個臨時的v,首先假設v為;這個假設是由於最後都需要把所有的向量都要歸一化

v: 建立u,u=v×n;

vi: 建立真正的v,v=n×u;

vii: 對所有的向量(uvn)進行歸一化

viii:計算出uvn旋轉逆矩陣

u.x v.x n.x 0

u.y v.y n.y 0

u.z v.z n.z 0

0 0 0 1

vx:根據逆平移矩陣和逆旋轉矩陣得出uvn座標變化矩陣

世界座標到相機座標變換:

這個變換就是乙個思路:首先計算出逆平移矩陣,然後計算出逆旋轉矩陣,最後把逆旋轉矩陣和逆平移矩陣合成乙個變換矩陣。世界座標通過這個矩陣變換到相機座標。

物體的剔除:

1. 首先對經過世界變換到相機變換的物體,進行剔除。

剔除方法:分別對x(左右剪裁面)、y(上下剪裁面)和z(遠近剪裁面)進行判斷,看看物體座標是否超出各剪裁面界限。

2. 如果超出剪裁面界限則設定乙個該多邊形已經被裁剪的標記。

不過,有乙個問題:如果物體的一部分在裡面,另一部分在外面則上述演算法不能處理很好。

背面消隱:

1. 計算出面法線:面上兩向量進行叉乘;

2. 計算出面發現和視點的夾角:進行點乘;如果夾角大於90度則進行背面消隱;

這裡需要指出的是,進行背面消隱的時候先確定物體或多邊形是單面有效的,即只有乙個面被人看到。其次,背面消隱只應用到世界座標中的關係,即確定出面法線和視點的關係即可,所以可以在進行世界變換到相機變換前進行背面消隱這樣可以減少大量的無謂計算。

相機座標變換到透視座標

1.投影變換公式:

x_per = viewing_distance * x_world / z_world;

y_per viewing_distance * aspect_ratio * y_world / z_world;

如果viewing_distance設定為1,則是平面座標是歸一化的即:x_per為-1到1,y_per為-1/ar到1/ar,其中,ar為螢幕的寬高比;

2.變換演算法:

變換演算法就是依次對多邊形列表或物體中的頂點進行變換,即套用上述公式即可。

需要注意的是軟體實現的投影變換最好用公式法,因為需要的cpu開銷小,如果用矩陣變換方式進行計算則需要更多的cpu開銷,用硬體實現的話矩陣變換方法最好,因為多數顯示卡只進行矩陣計算。

3D基礎 3D座標變換在OpenGL 中的實踐

在計算機圖形學中,變換矩陣是非常基礎也是非常重要的知識,在許多資料中,只是羅列出一堆矩陣公式,圖表等等,這很難給人感性的認識,特別是初學者,筆者結合 opengl 這樣乙個非常流行的圖形庫,以實踐的方式闡述在 3d變換矩陣中最簡單的三種 平移 縮放以及旋轉。這裡有一些前提知識,就是需要了解線性代數一...

附錄A 8 Direct3D中的3D座標變換

附錄a 8.direct3d中的3d座標變換 在遊戲裡有很多物體,就拿cs來說,常常看到裡面有很多木箱,這些木箱位置是怎麼樣放上去的呢?因為這些木箱都相同的,同樣大小,同樣紋理,但擺的位置不一樣,要表示這種不一樣的位置,就要用到3d座標空間,而用座標來表示兩個木箱相對位置。座標變換是3d遊戲裡最基本...

3D座標變換之自轉公轉

最近工作比較忙,好長時間沒更新了,今天得閒,再來一篇。我們拿太陽系為模型,主要實現太陽自轉 地球自轉 地球公轉 月球自轉 月球公轉效果。由於現在還沒有說到模型的繪製,我們現在暫時用正方體來代表三個星球。先來看一下,在direct3d中是如何生成平移 旋轉 縮放矩陣的。1 生成平移矩陣 c 1 2 d...