第二回:3D基本概念
上一回我們建立起了D3D的編程環境,但是不要著急開始編碼,我們還是先來看看3D中的一些基本概念,這些東西都是3D編程基礎中的基礎,一定要牢記。
用過3DMAX的人都知道,一個3D情境是由很多模型(model)組成的,而模型就是通常說的網格(mesh), 它是由三角形面(triangle)組成,而每個三角形面又是由3個頂點(vertex)構成。
材質(materal)和紋理(texture):
光有網格模型看上去就是一個物品的輪廓,為了讓模型具有真實感,我們就要為模型賦予材質和紋理。
材質包含顏色,D3D中這樣定義顏色:
typedef struct D3DXCOLOR
{
FLOAT r, g, b, a; // 分別對應 紅、綠、藍、透明度
} D3DXCOLOR;
材質的定義是:
// 材質
typedef struct _D3DMATERIAL8
{
D3DCOLORVALUE Diffuse; // 謾反射光
D3DCOLORVALUE Ambient; // 環境光線,理解為整體亮度
D3DCOLORVALUE Specular; // 鏡面反射,一般用於光滑的平面
D3DCOLORVALUE Emissive; // 放射光,一般用於自發光體(太陽、燈…)
float Power; // 指定鏡面高光的強度
} D3DMATERIAL8;
而紋理是附著在模型上的皮膚,在D3D中用IDIRECT3DTEXTURE8介面管理紋理。
下面是一個指定了材質和紋理的模型,看上去是不是真實多了。
向量(vector):
我們說一個模型就是一個對象:
對象都有其位置和方向,在3D空間中由三個值定義:x,y,z。
D3D中的位置和方向都是向量,向量定義為:
typedef struct _D3DVECTOR
{
float x; // x座標
float y; // y座標
float z; // z座標
} D3DVECTOR;
矩陣(matrix):
對象有了方向和位置後,要對其進行移動、放縮和旋轉等處理就需要用到矩陣。矩陣在D3D中的定義如下:
typedef struct _D3DMATRIX
{
union {
struct {
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float m[4][4];
};
} D3DMATRIX;
這是一個4*4的矩陣,通過矩陣變換能實現對象的各種處理。關於矩陣的知識,請大家下去看線形代數的書,這裡就不詳細介紹了。什嗎?你沒有學過線形代數,沒關係,死記吧,把幾個重要的變換公式記住就好了(平移、放縮和旋轉),其他任何複雜的變換都是通過這幾個基本的變換組合而成的。
再給大家吃個寬心丸吧,就算你記不住這些公式也無所謂,D3D已經把他們做好了,通過幾個簡單的函數調用就能實現麻煩的矩陣運算了,呵呵,微軟還是為大家想的很周到的。
燈光(light):
有了對象,還必須有燈光,否則我們將什麼都看不到。D3D中的燈光有兩4種:
環境光線:對情境中所有的對象都提供了固定不變的照明。
點光源:是從一個點發出的光。燈泡就可以理解為點光源。
聚光源:正如它的的名字一樣,是有方向和強弱的,電筒就是典型的聚光源。
方向光:常用於類比太陽光和其它無窮遠的光源。這種光源被看作來自無窮遠,它的強度不隨著接近對象而變化。在唯一的方向上,亮度是固定的。 D3D光源定義是這樣的:
typedef struct _D3DLIGHT8
{
D3DLIGHTTYPE Type; // 光源類型,有點光、聚光、方向光3種
D3DCOLORVALUE Diffuse; // 漫反射顏色
D3DCOLORVALUE Specular; // 鏡面反射顏色
D3DCOLORVALUE Ambient; // 環境光線顏色
D3DVECTOR Position; // 光源位置
D3DVECTOR Direction; // 方向(僅對方向光和聚光起作用)
float Range; // 光的範圍,也就是能照多遠
float Falloff; // 聚光內外光圈的強度衰減
float Attenuation0; // 距離衰減0
float Attenuation1; // 距離衰減1
float Attenuation2; // 距離衰減2
float Theta; // 指定聚光內圈的夾角大小(0-Phi)
float Phi; // 指定聚光外圈的夾角大小(0-pi)
} D3DLIGHT8;
攝像機(camera):
為了能看見對象,D3D定義了攝像機來代表使用者觀察3D世界。攝像機有一個位置和一個方向,它們定義了觀察者在3D世界的何處和看到的是什麼。在3D世界裡移動攝像機和改變它的方向使我們看到的世界真實的動起來。
在D3D中沒有專門定義攝象機的結構,我們是通過設定一個觀察矩陣來控制攝象機的。
pd3dDevice->SetTransform( D3DTS_VIEW, &m_matView ); // m_matView就是攝象機的觀察矩陣。
今天講了不少概念性的東西,我想你們也看的煩了,再說下去估計就該換到其他網站去了。好了,今天就到這裡吧。晚上我還要去書店看書,騎車要很遠的路,天氣又熱,真煩啊~~
下一次我們就開始實際動手,打造你的第一個D3D程式。
首頁:http://www.gpgame.com
郵件:softboy@sina.com
soft於2002-7-7午後
返回
金點時空 2000/7/7