C Direct3D9開發例項一 月球繞著地球轉

2021-04-01 22:58:17 字數 4328 閱讀 8208

新建乙個工程,新增引用,並匯入命名空間。

加入乙個裝置物件變數:

private microsoft.directx.direct3d.device device = null;

新增初始化圖形函式,並在這裡面對裝置物件進行例項化:

public void initializegraphics()

當程式執行時,需要繪製場景,**在這個函式裡:

public void render()

device.endscene();

//顯示裝置內容。

device.present();

}設定照相機的位置:

private void setupcamera()

現在改變主函式,呼叫我們寫的初始化函式,並顯示場景:

[stathread]

static void main()

earthform.dispose();

}執行程式,會顯示乙個空的窗體。

在這一步裡需建立乙個3d網格物件,來作為要顯示的地球,為此,在工程中新加入乙個類earth,此類可以包含所建立的網格物件的資訊。

public class earth : baseearth

在建構函式中,把device裝置拷貝到私有成員變數,這樣就可以在這個類的其它方法內使用它,另外就是把位置變數進行賦值:

public earth(ref device device, matrix location): base(ref device)

下面這個函式是裝入.x檔案。

public bool loadmesh(string meshfile)}}

return true;

}catch

}在這個方法內,使用mesh.fromfile()這個方法,從給定的檔名中找到.x檔案,並裝入相關資料,一旦資料格式設定完成,可以從此檔案中找到材質和貼圖資訊,並把它存放在陣列中,並通過檔案路徑,得到紋理檔案檔案的路徑,最後返回真值,如果整個過程出現錯誤,返回假值。

下面這個render()方法,是把此物件,即地球顯示在裝置物件上,此方法較簡單,通過變形操作來得到網格物件的x,y,z座標,接著設定網格物件的材質和紋理,最後,將每個材質和紋理應用到每個網格。

public void render(matrix worldtransform)

}private earth mesh = null;

private matrix meshloc;

private bool meshloaded = false;

在圖形初始化函式中,需要對網格物件進行初始化。加入下面的**:

meshloc = matrix.identity;

meshloc.m41 = 2.0f;

mesh = new earth(ref device, meshloc);

if (mesh.loadmesh(@"../../earth.x"))

**第一句把網格物件的位置定為原點,接著偏移x軸2個單位,接下來從檔案中得到此.x檔案。如果成功設定,meshloaded置為真。注意,這裡有乙個.x檔案,在源**中有此檔案。

在設定相機的函式中,加入一盞燈光:

device.lights[0].type = lighttype.directional;

device.lights[0].diffuse = color.white;

device.lights[0].direction = new vector3(0, -1, -1);

device.lights[0].update();

device.lights[0].enabled = true;

此燈光較簡單,僅為乙個直射型白光燈。

最後,在render()方法中,呼叫網格物件的render()方法,以顯示地球。

前面用乙個網格物件來建立地球,但此類沒有平移,旋轉及縮放等方法,下面就加入這些方法,因為這些方法具有通用性,因此可以新建乙個類,把這些方法寫在這些類中,使地球物件成為它的派生類。

在工程中新新增乙個類:baseearth;

加入進行平移、旋轉、縮放的變數:

private float xloc = 0.0f;

private float yloc = 0.0f;

private float zloc = 0.0f;

private float xrot = 0.0f;

private float yrot = 0.0f;

private float zrot = 0.0f;

private float xscale = 1.0f;

private float yscale = 1.0f;

private float zscale = 1.0f;

加入相應的屬性**:

public float xloc

set}

…………

在render()虛函式中,應用平移、旋轉及縮放。

public virtual void render()

現在回到地球類,需要將其改為新類的派生類,同時更改建構函式,另外,在render()方法中,應先呼叫基類的render()方法:

public override void render()

現在,由於在基類中可以設定物件位置,因此,可以把與locationoffset相關,即與設定位置的變數及語句注釋掉。

在這一步加入月球,實際上是再建立乙個網格物件新例項,只是把紋理進行更改即可,為了**模組性更好,把兩個物件放在乙個新類cmodel中,在工程中新新增乙個類cmodel,並宣告物件例項。

public class cmodel

把視窗**中的load()事件,放在cmodel中,這次不僅生成了地球,而且生成了月球。

public void load(ref device device)

else

if (mesh2.loadmesh(@"../../moon.x"))

else

}下面的update()方法中,引數dir 用來判斷是順時針旋轉還是逆時針旋轉,另外,地球和月球繞y軸增加的角度大小不同,也就決定了二者旋轉的速度不同。

public void update(int dir)

else if(dir < 0)

}在下面的render()方法中,生成顯示月球和地球:

public void render(ref device device)

}把視窗**中的加入燈光的方法,也放在此類中:

public void loadlights(ref device device)

public void light(ref device device)

private microsoft.directx.directinput.device mouse = null;

public system.threading.autoresetevent mouseupdated;

private float x, y, z = 0.0f;

private byte buttons;

在下面的建構函式**中,首先建立滑鼠裝置,並初始化**事件:

public cmouse(system.windows.forms.control control)

下面的update()方法中獲得滑鼠的座標值,並賦給私有成員變數:

public void update()

還需要有乙個函式來檢測滑鼠左鍵是否按下:

public bool leftbuttondown

}現在已經做完了準備工作,返回到視窗**中,需要對這裡的**重新進行一些調整:

在圖形初始化函式中建立乙個cmodel類及cmouse類:

private cmodel model = null;

private cmouse mouse = null;

private bool leftbuttondown = false;

private float mou***loc;

新增對滑鼠初始化的方法:

public void initializeinput()

新增updateinputstate()方法,當按下滑鼠左鍵時,將leftbuttondown值設定為真,當滑鼠抬起時,將mou***loc置0:

private void updateinputstate()

else

}else

}在此程式中,只對x值進行了操作,即只能左右轉。

render()方法更新如下:

public void render()

最後更改main()主函式:

static void main()

earthform.dispose();

}執行程式,按下滑鼠左鍵拖動,即可旋轉月球與地球。

(一)D3D9渲染原理

su ce和texture。使用su ce相對來說比使用texture要簡單一些,但是不如使用texture靈活。抽象概念 direct3d的抽象概念包括 devices 裝置 swap chains 交換鏈 和resources 資源 device 裝置 用於渲染3d場景。例如單色裝置就會渲染黑白...

ogre3D學習基礎9 光源程式例項

這一章練習一下光源的使用,光源分為三種 點光源,聚光源,有向光。具體內容前面說過,這裡就不解釋了。繼續在上一章的程式的基礎上實現。1 建立攝像機 camera 1 class example1 public212 其他 13 2 建立視口 viewport 1 virtual void create...

WPF 3D開發教程(一)

我們知道,在2d平面繪圖時,wpf使用的座標系 其實計算機上的圖形處理一般都是這樣 是以螢幕左上角為原點,向右為x軸正方向,向下為y軸正方向。而wpf的3d座標系,取區域中心為原點,向右為x軸正方向,向上為y軸正方向,z軸正方向垂直於螢幕指向我們。這是乙個右手系,讀者可以伸出自己的右手,做下圖所示動...