新建乙個工程,新增引用,並匯入命名空間。
加入乙個裝置物件變數:
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軸正方向垂直於螢幕指向我們。這是乙個右手系,讀者可以伸出自己的右手,做下圖所示動...