DirectX9 3D快速上手 3

2021-03-31 20:24:36 字數 4740 閱讀 2615

directx9 3d

快速上手3

by sssa2000

4/15/2005

我們這裡暫時先跳過,乏味的索引緩衝和深度緩衝的內容,先看看怎麼在

3d空間中實現乙個東西,給自己來點成就感。

正好sdk

的嚮導也是這麼安排的,呵呵,那我們就繼續從嚮導出發吧,以

tutorial 3

為例子。

這個例子主要講解運用變換矩陣來實現物體的變換,學過圖形學或者線性代數的肯定就很容易理解,沒學過的,找點這方面的資料看看就可以了。

先看看這個例子實現了什麼,編譯執行,噢,相比前面兩個例子,有耳目一新的感覺,乙個三角形繞著y軸旋轉。

相比tutorial 2

,多了2個函式:

onresetdevice

和setupmatrices。其中有注釋,中文由我翻譯,e文太差,翻譯得不好不要b4我啊

public

void onresetdevice(object sender, eventargs e)

private

void setupmatrices()

所有的新東西都在這裡了,一共不到

10條語句,簡單吧?有幾點要解釋一下。

dev.renderstate.cullmode = cull.none;

這一句,或許很多人會疑惑,首先了解一下

dx的背面剔除功能,和現實中一樣,我們同一時間只能夠看到乙個物體的一面,看不到它的背面,這就是背面剔除。

cull

是乙個列舉,一共

3個值:

counterclockwise

3cull back faces with counterclockwise vertices.

clockwise

2cull back faces with clockwise vertices.

none

1do not cull back faces.

如果我們指定了背面剔除的方式,那麼我們就看不到物體的背面,這樣當三角形轉過來的時候我們就看不到轉過來的東西,所以設定為

none

,如果不理解,可以在程式中修改一下這一句話,就能很直觀的理解了。

這個例子就這麼多內容,當然你也可以把

rotatey

改為,rotatex, rotatez

等等,可以更加好的理解一下這個例子。

接下來我們來了解一下

mesh

。對我們初學者來說

mesh

應該是乙個讓人激動的東西,讓我們來看看介紹:

mesh

可以用來儲存任何型別的圖形資料,但主要用來封裝複雜的模型。

mesh

類同樣也有一些用來提高渲染物體效能的方法。用

mesh

你可以從外部檔案讀入

3d的模型例如

.3ds

檔案,這樣我們就可以在

3d max

中做好模型,然後讀入程式,想想看,乙個遊戲的雛形是不是已經在你腦海了呢?

mesh

物件內部也包含了很多幾何體的模型,我們來看看怎麼使用它,因為使用它比使用頂點要快捷方便得多,一會你就會深刻體會到。

首先我們要先建立乙個

mesh

物件private mesh mesh = null;

然後mesh = mesh.box(device,

2.0f,

2.0f,

2.0f);

這樣我們就建立了乙個長寬高都為

2的立方體,很簡單吧?如果你用頂點來建立的話,最快的方法,即使用索引緩衝器,深度緩衝器也要寫

8個頂點得值,還要

setstreamsource

等等繁瑣的工作,這一切在

mesh

中都替我們完成了。當然,

mesh

內建的幾何形體還有很多,比如圓柱,茶壺等等,你可以乙個乙個的試一下。

我們來看看核心的

drawbox

函式:this is equivalent

private

void drawbox(float yaw, float pitch, float roll, float x, float y, float z)

先介紹matrix.rotationyawpitchroll

方法,看看他的原形:

public staticmatrixrotationyawpitchroll(

floatyaw, //

偏移量,即繞

y軸的轉動角度

floatpitch,//

斜度,即繞

x軸的角度

floatroll//

滾動,即繞

z的角度

);材質(materials描述了這樣的一種屬性。你可以指定物體如何反射環境光以及散射(diffuse光線,鏡面高光(specular highlights(少後會討論它)看起來是什麼樣,以及物體是否完全反射(emit光線。 這裡建立了乙個新的材質,它的環境顏色(ambient color(注:環境顏色和環境光的顏色是不同的

^_^)和散射顏色值都被設定為白色。使用白色表示它會反射所有的光線。接下來,我們把材質賦予了

device

的material

屬性,這樣

direct3d

就知道渲染時使用那種材質資料。

這裡介紹一點關於光線和色彩的知識:環境色(ambient color,當其為黑色時,表示(環境光)不會影響材質的顏色,當環境色變淺時,它就會照亮材質,並將兩種顏色混和起來,從而影響材質的顏色。如何場景中有環境光,那麼這些光的顏色和亮度就會控制環境色對於最終材質顏色的影響程度)。把材質改為沒有紅色成分的顏色(比如綠色)會使物體再次變為黑色(注:因為此時物體不會反射紅色,紅色的光線被物體全部吸收了),改為含一些紅色成分的顏色(比如灰色

gray

)會使物體呈現深灰色。

mesh

會被分為一系列的子集(

subsets

)(依據屬性緩衝的大小來分配),同時使用乙個叫做

「drawsubset」

的方法來渲染。使用

mesh

類建立的普通圖元總是只有乙個基於

0的子集。所以使用了

mesh.drawsubset(0)

下面附上這個例子的全部**:

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 setupcamera()

protected

override

void onpaint(system.windows.forms.painteventargs e)

private

void drawbox(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() }}

}不知道大家注意到沒有,我注釋掉了很多

drawbox

函式的呼叫,你也可以把它改過來,執行看看,你會發現乙個問題,就是如果你畫9個

box和你畫乙個

box,旋轉的速度是不一樣的,因為這裡並沒有像上個例子那樣對時間有強制的調整。這個例子裡面還有一些是關於燈光的,我們馬上就會講到,其實從字面也可以看出來是什麼意思。接下來我們就要去讀入我們自己的模型了,激動啊。

2005-4-15

DirectX9 3D 快速上手 4

directx9 3d 快速上手4 bysssa2000 4 17 2005 接下來我們要使用 mesh 讀入.x 檔案,關於 x檔案,其實可以說很多,我們可以用外部的工具例如 3ds max 來建立.3ds 檔案,然後利用微軟提供給我們的工具轉換成 x檔案,如果你同時會用 3ds你也許會問,那材質...

DvaJS快速上手(3)

詳情看擴充套件預算符 簡單理解就是將傳入的number賦值給當前props的number變數,實現更新資料 此處會導致number發生更新,也就是props發生了變化,所以有監聽props的元件也會發生變化 import react,from react import from dva import...

3 快速上手Spring

匯入jar包 org.springframeworkgroupid spring webmvcartifactid 5.2.6.releaseversion dependency 編寫 編寫乙個hello實體類 public class hello public void setstr string...