3D遊戲從頭編–第二回:3D基本概念

來源:互聯網
上載者:User

::金點時空::

第二回: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

www.gpgame.net

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.