3D遊戲從入門到精通 30

2021-08-22 05:21:28 字數 2107 閱讀 7814

載入複雜網格模型

上面都是簡單的網格例子,並且只能作為演示作用,沒有多少實用價值,下面來載入乙個更複雜的網格模型。在我們玩過的遊戲裡,絕大多數都有室內場境的地方,比如到**店裡買東西,就需要有乙個室內場境。在我們最常見的房子,大多數都是長方形的,也就是有6個面的立方體,而在這六個面貼上紋理,就是室內環境了。由於我沒有美工,只能拿現成的網格模型來載入顯示,模型檔案放在目錄g:/mm3d/engine/bin/models裡,其中room.x是網格模型檔案,doordiff.dds、fireplacediff.dds、oldwood.dds、wall*****.dds都是紋理。實現的效果圖如下:

電子書mm3d引擎源程式例子源程式49元一套

聯絡人:蔡軍生

****:

email: caimouse1976 at sina.com

在這個場境裡,主要有四部份組成,地板是由貼木板紋理的模型組成。四周的牆是由花紋紋理的模型組成。還有乙個門模型,以及火牆模型。在這個例子裡,比上面乙個複雜的地方,就是多了紋理貼圖。

先看看載入網格模型的函式,看看怎麼樣實現載入網格和紋理。 //

//載入網格模型。

//蔡軍生 2006/09/15 //

hresult ccairoom::loadmeshfromfile(void)

std::string strname(chpath);

std::basic_string ::size_type stpos = strname.find_last_of("//");

if(stpos != std::string::npos)

std::string strpath = strname;

const std::string strfile("//bin//models");

strname += strfile;

//載入x檔案。

lpd3dxbuffer padjacencybuffer = null;

lpd3dxbuffer pd3dxmtrlbuffer = null;

hresult hr = d3dxloadmeshfromx( strname.c_str(), d3dxmesh_managed,

m_pd3ddevice, &padjacencybuffer,

&pd3dxmtrlbuffer, null, &m_dwnumroommaterials,

&m_pmeshroom );

if (failed(hr))

// 優化網格顯示。

if( failed( hr = m_pmeshroom->optimizeinplace(

d3dxmeshopt_compact | d3dxmeshopt_attrsort | d3dxmeshopt_vertexcache,

(dword*)padjacencybuffer->getbufferpointer(), null, null, null ) ) )

if (pd3dxmtrlbuffer)

return dxtrace_err("optimizeinplace",hr); }

//是否有材料。

if (pd3dxmtrlbuffer && m_dwnumroommaterials > 0)

//儲存材料和紋理。

3D遊戲從入門到精通 30

載入複雜網格模型 上面都是簡單的網格例子,並且只能作為演示作用,沒有多少實用價值,下面來載入乙個更複雜的網格模型。在我們玩過的遊戲裡,絕大多數都有室內場境的地方,比如到 店裡買東西,就需要有乙個室內場境。在我們最常見的房子,大多數都是長方形的,也就是有6個面的立方體,而在這六個面貼上紋理,就是室內環...

3D遊戲從入門到精通 31

當我們看到現實世界裡,有很多山地。那麼這種山地,在 3d世界裡又是怎麼樣顯示出來的呢?要模擬現實中的山地,就需要研究它怎麼樣構成,然後採用各種方法建立出來。在遊戲的世界裡,對於地形的要求是不嚴謹的,只要看起來像山地,就行了,而不像其它地理系統,一定要精確到跟現實世界里山比例一樣。因此,在這裡建立的 ...

3D遊戲從入門到精通 21 22

2.10.1 燈光與材質 在現實的世界裡,沒有光線,是什麼東西也看不見的。在d3d的世界裡,也是一樣的。但是在d3d裡有一種光線,是非常奇怪的,這種光線是沒有方向,沒有位置,整個世界全可以照亮的光線,它就是環境光,它其實有點像我們現實生活裡的無影燈。在d3d裡光線分為三種型別,分別是點光源 聚光燈和...