directx9 3d
快速上手4
bysssa2000
4/17/2005
接下來我們要使用
mesh
讀入.x
檔案,關於
.x檔案,其實可以說很多,我們可以用外部的工具例如
3ds max
來建立.3ds
檔案,然後利用微軟提供給我們的工具轉換成
.x檔案,如果你同時會用
3ds你也許會問,那材質怎麼辦?
你不用擔心,
.x檔案能自動的包含材質,和動畫,所以利用
mesh
我們可以方便的八我們在
3ds max
的做品用在遊戲中。
.x檔案允許自定義的擴充套件,當然這個我們在以後的內容也會講到,我們先看怎麼使用,順便提一句,還有一種用得比較多的檔案格式
.md3
格式的檔案,也就是
quake3
使用的檔案,如果有機會我也會講到。
關於3ds
檔案和.x
轉換可以參看
gameres
**的文章
接下來的過程簡單的讓你無法相信,請看:
private mesh mesh = null; //
建立mesh物件
private material meshmaterials;//
用於儲存材質
private texture meshtextures;//
用於儲存紋理
private
void loadmesh(string file)}}
}如果你覺得這裡**比較混亂,沒有關係,我們來理一理,首先要說的是
mesh
類還有兩個主要的靜態方法可以載入外部模型。這兩個方法分別是
mesh.formfile
和mesh.fromstream
。兩個方法本質上來說都是一樣的,
stream
方法有更多的過載以適應不同大小的流。
mesh.formfile
最簡單,我們就先只介紹這個,這個方法有很多過載的版本,我們用的是引數最多的乙個,這樣其他的也都好理解了:
public staticmeshfromfile(
stringfilename, //
檔名meshflagsoptions,//
控制著去**以及如何載入資料
devicedevice,//
渲染mesh
的device
outgraphicsstreamadjacency,//
儲存每個面相鄰的3個面
outextendedmaterialmaterials,//
儲存了普通的
direct3d
材質和乙個載入為紋理的字串,
常是使用的紋理或資源檔名
outeffectinstanceeffects //
描述了用於
mesh
的hlsl
材質檔案和值。
);我們使用的是乙個有
4引數的方法:
public staticmeshfromfile(
stringfilename,
meshflagsoptions,
devicedevice,
outextendedmaterialmaterials
);接下來,如果讀入的這個
.x檔案有材質或者紋理,就根據材質和紋理的大小建立陣列以儲存這些紋理和材質。
因為mesh
中可能有許多不同的子集,所以需要分別建立乙個材質和紋理的陣列以滿足每乙個子集的需要。
mesh
會自動地把每乙個子集和這些子集的材質紋理一一對座。
這樣我們就完成了乙個
loadmesh
函式,這個函式我們可以用在以後任何需要讀入
.x檔案的地方,十分的方便。
下面我們來看看我們的成果,當然我們還需要在繪圖的地方加幾句:
for (int i = 0; i < meshmaterials.length; i++)
好了,現在我們可以在以往的框架的基礎上編譯一下了,我們可以看到已經讀入了乙個
.x檔案,不管怎麼樣
都是值得慶賀的。我們再看看
sdk
tutorial6
的例子後,
發現這個程式的結果可以旋轉,其實也很好實現,我們只需要設定一下旋轉矩陣就可以了,就像上一張我們講的那樣,在上面那段for前面加上一句就可以了:
device.transform.world = matrix.rotationyawpitchroll(yaw, pitch, roll) * matrix.translation(x, y, z);
好了這樣我們也就達到目的了,你也可以隨自己的意思設定變換矩陣,很
cool
吧?好了,下面是完整的**,如果大家有什麼意見,發到我的
blog
上吧。大家一起進步。
using
system;
using
system.drawing;
using
system.collections;
using
system.***ponentmodel;
using
system.windows.forms;
using
system.data;
using
microsoft.directx;
using
microsoft.directx.direct3d;
namespace
chapter5code
//////
we will initialize our graphics device here
///public
void initializegraphics()
private
void loadmesh(string file)}}
}private
void setupcamera()
protected
override
void onpaint(system.windows.forms.painteventargs e)
private
void drawmesh(float yaw, float pitch, float roll, float x, float y, float z)
}///
///clean up any resources being used.
///protected
override
void dispose( bool disposing )
}base.dispose( disposing );
}#region
windows form designer generated code
//////
required method for designer support - do not modify
///the contents of this method with the code editor.
///private
void initialize***ponent()
#endregion
//////
///static
void
main
() }}
}其實我們都已經發現,到目前為止我們的程式都是遵循乙個固定的框架,有時候你發現程式很長,其實從框架角度來看,就沒那麼長了,怕看長**的人可以注意一下,同時很多**都是通用的。下次學習怎麼操控
mesh
。by sssa2000
4/17/2005
DirectX9 3D快速上手 3
directx9 3d 快速上手3 by sssa2000 4 15 2005 我們這裡暫時先跳過,乏味的索引緩衝和深度緩衝的內容,先看看怎麼在 3d空間中實現乙個東西,給自己來點成就感。正好sdk 的嚮導也是這麼安排的,呵呵,那我們就繼續從嚮導出發吧,以 tutorial 3 為例子。這個例子主要...
webpack4快速上手
1.在專案根目錄cnpm init y初始化。生成package.json檔案 2.在專案裡面使用cnpm安裝webpack 3.需要在根目錄下新建webpack.config.js檔案 在其裡面配置暴露物件 module.exports 4.在根目錄下新建src index.js檔案 因為此時執行...
Extjs4快速上手四 實現選單
原文 這幾天狀態不佳,雜事太多有些煩心,這一次就少講點吧。本次將主要講extjs樹形選單的實現。在很多系統裡邊,樹形選單被廣泛應用,主要因為其有清晰的層次結構。記得最早見到的樹形選單是通 過實現的,非常簡單。之後用c 的現成控制項拖拽了乙個,當時還沾沾自喜。再後來在學習師兄的乙個通用後台 時,看到了...