Beginning DirectX9 Dch bi TransTeam din đàn Gamedev.VN
58
CHƯƠNG 4
NHNG KIN THC CƠ BN V 3D
hc các bn cũng thy game 2D đang dn b tt hu trong mt vài năm gn đây.
Đa s các game bây gi đều c s dng được sc mnh ca các loi card 3D mi
nht, c gng làm cho game tht hơn. Direct3D là mt thành phn quan trng
trong trào lưu này. Nó cho phép hàng triu khách hàng ca Microsoft Windows được
thưởng thc nhng công ngh game mi nht.
Nhng gì bn s được hc chương này:
Không gian 3D được s dng thế nào.
H thng to độ là gì.
Cách dng nhng đim ca mt đa giác.
Khái nim vecto trong Direct3D.
Vertex buffer là gì.
Khái nim khung cnh 3D (3D scene) .
Nhng cu trúc cơ bn bn có th s dng.
Không gian 3D
Phn trước, tôi đã nói v nhng game ch cho phép di chuyn theo 2 phương, tc là trong
không gian phng. Khái nim (sprites) mà bn dùng trên ch yếu là cho không gian vi
chiu rng và chiu cao nhưng không có chiu sâu.
DIrect3D cho bn kh năng đưa thêm mt chiu không gian na vào thế gii game vi s
b sung ca chiu sâu. Chiu sâu là kh năng ca vt th có th di chuyn ra xa hoc li
gn người quan sát. Nhân vt trong thế gii 3D s tht hơn nhiu bn sao ca chúng
trong không gian 2D.
Không gian 3D cho phép nhân vt di chuyn vòng quanh theo cách tương t như thế gii
thc. Trước khi bn tn dng được li thế ca không gian 3D, bn cn biết cách xây dng
nó, và cách đặt các vt th vào đó.
H thng to độ
H thng to độ là cách để định nghĩa đim trong không gian. Nó bao gm các đường
thng vuông góc vi nhau gi là các trc to độ. H to độ 2D ch gm 2 trc to độ, còn
C
Beginning DirectX9 Dch bi TransTeam din đàn Gamedev.VN
59
h 3D thì có thêm mt trc na. Tâm đim ca h to độ, nơi mà các trc to độ giao
nhau, được gi là gc to độ. Hình 4.1 biu hin h trc to độ 2D. Hai trc ca h to độ
2D được kí hiu là X và Y. X là trc nm ngang, còn Y là trc thng đứng.
Xác định mt đim trong không gian 2D
Mt đim được xác định như mt v trí duy nht trên mt trc. Mt đim trong không
gian 1D, (ch có duy nht mt trc), có th được biu din qua mt giá tr. Hình 4.2 biu
din đim trong không gian 1D. Gc ca đường thng có giá tr là 0. Hướng sang bên
phi ca gc to độ là các giá tr dương, ngược li, bên trái gc to độ là các giá tr âm.
Trong hình 4.2, đim biu din có giá tr là dương 4.
Hình 4.1 Hình 4.2
H to độ 2D, vì nó có 2 trc to độ, nên đòi hi thêm mt giá tr na để biu din mt
đim. Để biu din mt đim trong không gian 2D, bn cn xác định v trí dc theo trc X
và Y ca nó. Ví d, mt đim trong h to độ 2D có th được xác định bng 2 s là X và
Y, mi s xác định mt v trí trên trc tương ng. Ging như ví d 1D hình 4.2, nhng
giá tr trên trc X tăng dn t trái qua phi, nhưng nhng giá tr trên trc Y li tăng dn t
dưới lên trên. Hình 4.3 cho thy h to độ 2D vi mt đim có to độ X=3 và Y=5, người
ta thường viết dưới dng (X, Y). Trong ví d này đim đó được biu din là (3, 5).
Xác định 1 đim trong không gian 3D
Như đã đề cp phn trên, h to độ 3D có thêm mt trc na, gi là trc Z. Trc Z
vuông góc vi mt phng to bi trc X và Y. Hình 4.4 cho ta thy v trí ca trc Z.
Chú ý rng trong h trc to độ này, trc X và Y để th hin chiu rng và chiu cao, còn
trc Z th hin chiu sâu. Trc Z có c giá tr âm và dương khi ta di chuyn so vi gôc to
độ tu thuc vào loi h to độ. H to độ thường được sp đặt theo c kiu tay trái ln
kiu tay phi.
Hình 4.3 Hình 4.4
Beginning DirectX9 Dch bi TransTeam din đàn Gamedev.VN
60
H to độ tay trái
H to độ tay trái: chiu dương trc X hướng vn phi và chiu dương trc Y hướng
lên trên. S khác nhau ch yếu là trc Z. Trc Z trong h to độ này có chiu dương
hướng ra xa người nhìn, và chiu âm hướng v phía người nhìn. Hình 4.5 biu din h to
độ tay trái. Đây là h to độ được s dng trong Direct3D.
H to độ tay phi
H ta độ tay phi được dùng trong OpenGL, có trc X và trc Y ging như h ta độ tay
trái, nhưng trc Z thì theo chiu ngược li. Chiu dương ca trc Z hướng v phía người
nhìn, trong khi chiu âm thì đi ra xa. Hình 4.6 biu din h ta độ tay trái.
Khái nim v vector
Mt vecto tương t như là mt đim. Vecto bao gm các thông tin v ta độ X, Y, Z và
đồng thi cũng cha đựng nhng thông tin khác na, ví d như là màu sc hoc texture.
Hình 4.5: h ta độ tay trái Hình 4.6: h ta độ tay phi
Cu trúc để mô t vecto:
struct {
float x;
float y;
float z;
} vertex;
Cu trúc vecto này gm 3 biến kiu float, miêu
t v trí ca vecto so vi các trc ta độ.
To mt hình
Bn có th to mt hình nào đó bng cách dùng
2 hoc nhiu vecto. Ví d, để to mt hình tam
giác ta cn có ba vecto để xác định ba đỉnh ca
tam giác. S dng vecto để th hin mt hình
ging như vic ta ni các đim li vi nhau.
Hình 4.7 cho thy cách to ra mt hình tam giác
bng ba vecto.
Hình 4.7 To tam giác bng 3 vector
Beginning DirectX9 Dch bi TransTeam din đàn Gamedev.VN
61
Để to mt hình tam giác cn có 3 vecto
struct {
float x; // to độ X
float y; // to độ Y
float z; // to độ Z
} vertex [ 3 ];
đây, tôi va khai báo mt mng gm 3 vecto. Bước tiếp theo là xác định v trí cho các
vecto theo như hình 4.7.
// vecto th nht
vertex[0].x = 2.0; // gán ta độ X
vertex[0].y = 4.0; // gán ta độ Y
vertex[0].z = 0.0; // gán ta độ Z
// vecto th hai
vertex[1].x = 5.0; // gán ta độ X
vertex[1].y = 1.0; // gán ta độ Y
vertex[1].z = 0.0; // gán ta độ Z
// vecto th ba
vertex[0].x = 2.0; // gán ta độ X
vertex[0].y = 1.0; // gán ta độ Y
vertex[0].z = 0.0; // gán ta độ Z
Chú ý là ta độ Z ca c ba vecto đều được gán là 0. Do tam giác này không có chiu sâu,
nên ta độ Z gi nguyên giá tr 0.
Cho thêm màu sc
trên, cu trúc vecto ch gm thông tin liên quan đến v trí ca vecto. Tuy nhiên, vecto
cũng có th cha thông tin v màu sc. Thông tin v màu sc này có th cha trong bn
biến được thêm vào là R, G, B và A.
+ R là thành phn đỏ ca màu.
+ G là thành phn xanh lá cây ca màu.
+ B là thành phn xanh nước bin ca màu.
+ A h s alpha ca màu.
Mi mt giá tr trên giúp ta xác định màu ca vecto. Cu trúc vecto lúc này được b sung
như sau:
struct {
// thông tin v v trí
float x;
float y;
float z;
// thông tin v màu sc
float R;
float G;
float B;
float A;
} vertex;
S dng các biến R, G, B và A, bn có th đặt màu cho vecto. Ví d, nếu bn mun vecto
có màu trng, thì các biến R, G và B đều được đặt là 1.0. Đặt màu vecto bng màu nước
bin thì R và G được gán là 0.0 trong khi B gán là 1.0.
Chú ý:
Tam giác là hình khép kín đơn gin nht khi dùng vecto để biu din. Bn có th to được
nhng hình phc tp hơn như hình vuông, hình cu… nhưng thc ra chúng cũng được
chia nh ra thành các hình tam giác trước khi v.
Beginning DirectX9 Dch bi TransTeam din đàn Gamedev.VN
62
Vertex Buffers
Vertex buffers là nhng vùng nh cha thông tin v vecto cn thiết để to ra các đối
tượng 3D. Nhng vecto cha trong buffer có th cha đựng nhiu dng thông tin khác
nhau, như thông tin v v trí, h texture, màu sc. Vertex buffers rt hu dng cho lưu tr
hình tĩnh (nhng th cn render lp li nhiu ln). Vertex buffers có th tn ti c trong
b nh h thng và trong b nh ca thiết b đồ ha.
Để to mt vertex buffer ta cn khai báo mt biến có cu trúc IDirect3DVertexBuffer9.
Nó cha tr tr ti vertex buffer do DirectX to ra.
Bước tiếp theo, ng dng cn to mt vertex buffer và lưu tr trong biến va khai
báo. Sau khi to thành công vertex buffer, ta có th lưu d liu vecto vào đó. Ta thc hin
điu đó bng cách khóa vertex buffer và copy d liu vecto vào đó.
To mt vertex buffer
Bn có th to vertex buffer thông qua li gi hàm CreateVertexBuffer. Hàm này, gm
sáu đối s, được định nghĩa như sau:
HRESULT CreateVertexBuffer(
UINT Length,
DWORD Usage,
DWORD FVF,
D3DPOOL Pool,
IDirect3DVertexBuffer9** ppVertexBuffer,
HANDLE* pHandle
);
Length. Biến xác định chiu dài ca vertex buffer tính theo byte.
Usage. C quy định cách th hin ca vertex buffer. Giá tr này thường gán là 0.
FVF. Định dng mm do mà vertex buffer s dng.
Pool. Vùng nh cha vertex buffer. Giá tr này có kiu D3DPOOL.
ppVertexBuffer. Con tr có cu trúc IDirect3DVertexBuffer9 tr ti vertex buffer va to ra.
pHandle. Giá tr này nên đặt là NULL.
Nhng vecto lưu trong 1 vertex buffer có cu trúc rt mm do. V cơ bn, điu này có
nghĩa là nhng vecto cha trong buffer có th ch cha thông tin v v trí, hoc có th
cha c thông tin v màu sc hay texture. Kiu d liu ca vecto được điu khin thông
qua c định dng mm do ca vecto (FVF - Flexible Vertex Format).
Định dng mm do ca vecto
Định dng mm do ca vecto cho phép s tùy biến v thông tin cha trong vertex buffer.
Bng cách s dng c FVF, ta có th thay đổi buffer để cha bt kì dng vecto nào. Bng
4.1 mô t chi tiết v c FVF.
D3DFVF_XYZ Định dng gm X, Y, Z ca vecto chưa qua biến đổi.
D3DFVF_XYZRHW Định dng gm X, Y, Z ca vecto đã qua biến đổi.
D3DFVF_XYZW Định dng cha d liu vecto đã qua biến đổi, ct xén.
D3DFVF_NORMAL Định dng cha d liu thông thường.
Chú ý:
Thành phn alpha ca màu quyết định độ trong sut ca nó. Nếu giá tr alpha là 0, thì màu
được xác định bng R, G và B smàu đặc. Nếu alpha ln hơn 0, thì màu lúc này s
mt mc độ trong nào đó. Giá tr ca alpha là t 0.0f đến 1.0f.