( تعداد نمایش : 1658 )

آموزش DirectX-Graphic در ویژوال بیسیک قسمت ششم

تعریف ماترسها

۱ – World Matrix : این ماتریس برای نگهداری تمام vertex هایی که برای رندر فرستاده می شوند بکار می رود . مقادیر موجود در این ماتریس ، موقعیت یک vertex را می تواند تغییر دهد . یکی از کاربردهای آن انجام دورانrotation ، انتقال transmittion و تغییر اندازه scaling است .
برای ساخت این ماتریس از دستور زیر استفاده می کنیم :

D3DXMatrixIdentify matworld

حال این ماتریس را برای device مربوطه تایید می کنیم :

D3DDevice.SetTransform D3DTS_WORLD,matworld

۲ – View Matrix : این ماتریس را بعنوان یک دوربین در نظر بگیرید که بوسیله یک نقطه شروع و یک نقطه پایانی مشخص می شود ( مشابه یک up vector که معمولاً در طول محور y رو به بالاست ) :

D3DXMatrixLookAtLH matView, MakeV(0, 5, 9), MakeV(0, 0, 0),MakeV(0, 1, 0) x
D3DDevice.SetTransform D3DTS_VIEW, matView

تابع MakeV که در اینجا استفاده شده بصورت زیر است :

Private Function MakeV(x As Single, y As Single, z As Single) As D3DVECTOR
MakeV.x = x
MakeV.y = y
MakeV.z = z
End Function

۳ – Projection Matrix : این ماتریس مشخص می کند چه منطقه ای از فضای جهانی برای رندر کردن visible باشد . همچنین مشخص می کند چه مقدار می توانیم بطور افقی ببینیم ( زاویه دید بزرگتر منجر به دید بزرگتر می شود ) :

D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500

در دستور فوق از زاویه دید pi/4 رادیان استفاده شده همچنین نسبت ۱:۱ استفاده شده است . قسمتهای سوم و چهارم مشخص می کنند فقط مثلثهایی کشیده شوند که با ابعاد بزرگتر از یکدهم دوربین و کوچکتر از ۵۰۰ برابر دوربین هستند .
حال دستور اختصاص به device را خواهیم داشت :

D3DDevice.SetTransform D3DTS_PROJECTION, matProj

بعد از تعریف ماتریسها بایستی تابع InitializeGeometry را صدا کنیم . در این تابع از یک ثابت با نام DFC استفاده شده است . اگر DFC=1 باشد مکعب بطور کامل کشیده می شود و اگر بزرگتر از یک باشد ، face های آن جدا از هم دیده خواهند شد . همچنین توجه کنید که از بافرهای vertex برای ذخیره داده vertex ها استفاده شده است . ساختار این تابع بصورت زیر خواهد بود :
۱ – پر کردن ساختارهای vertex

‘Front
Cube(0) = CreateLitVertex(-1, 1, DFC, color, 0, 0, 0)x
Cube(1) = CreateLitVertex(1, 1, DFC, color, 0, 0, 0)x
Cube(2) = CreateLitVertex(-1, -1, DFCcolor, 0, 0, 0)x
Cube(4) = CreateLitVertex(-1, -1, DFC, color, 0, 0, 0)x
Cube(5) = CreateLitVertex(1, -1, DFC, color, 0, 0, 0)x
‘Back
Cube(6) = CreateLitVertex(-1, 1, -DFC, color, 0, 0, 0)x
Cube(7) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)x
Cube(8) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)x
Cube(9) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)x
Cube(10) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)x
Cube(11) = CreateLitVertex(1, -1, -DFC, color, 0, 0, 0)x
‘Right
Cube(12) = CreateLitVertex(-DFC, 1, -1, color, 0, 0, 0)x
Cube(13) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)x
Cube(14) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)x
Cube(15) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)x
Cube(16) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)x
Cube(17) = CreateLitVertex(-DFC, -1, 1, color, 0, 0, 0)x
‘Left
Cube(18) = CreateLitVertex(DFC, 1, -1, color, 0, 0, 0)x
Cube(20) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)x
Cube(21) = CreateLitVertex(DFC, 1, 1, color, 0, 0, 0)x
Cube(22) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)x
Cube(23) = CreateLitVertex(DFC, -1, 1, color, 0, 0, 0)x
‘Top
Cube(24) = CreateLitVertex(-1, DFC, 1, color, 0, 0, 0)x
Cube(25) = CreateLitVertex(1, DFC, 1, color, 0, 0, 0)x
Cube(26) = CreateLitVertex(-1, DFC, -1, color, 0, 0, 0)x
Cube(27) = CreateLitVertex(1, DFC, 1, cocolor, 0, 0, 0)x
Cube(29) = CreateLitVertex(1, DFC, -1, color, 0, 0, 0)x
‘Bottom
Cube(30) = CreateLitVertex(-1, -DFC, 1, color, 0, 0, 0)x
Cube(31) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)x
Cube(32) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)x
Cube(33) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)x
Cube(34) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)x
Cube(35) = CreateLitVertex(1, -DFC, -1, color, 0, 0, 0)x

2 – ساخت یک بافر vertex خالی با سایز مورد نظر :

Set VBuffer = D3DDevice.CreateVertexBuffer(Len(Cube(0)) * 36, 0, Lit_FVF, D3DPOOL_DEFAULT)x

3 – پر کردن بافر مربوطه با داده ها :

D3DVertexBuffer8SetData VBuffer, 0, Len(Cube(0)) * 36, 0, Cube(0)x

حال به سراغ روتین Render می رویم :

Public Sub Render
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0 ‘//Clear the screen black
D3DDevice.BeginScene
D3DDevice.SetStreamSource 0, VBuffer, Len(Cube(0))x
D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 12
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

ساختار اصلی برنامه بصورت زیر خواهد بود :

Dim RotateAngle As Single
Dim matTemp As D3DMATRIX ‘//To hold temporary
call Initialize
Do While bRunning
RotateAngle = RotateAngle + 0.1
If RotateAngle >= 360 Then RotateAngle = RotateAngle – 360
D3DXMatrixIdentity matWorld ‘//Reset our world matrix
D3DXMatrixIdentity matTemp
D3DXMatrixRotationX matTemp, RotateAngle * (pi / 180) x
D3DXMatrixMultiply matWorld, matWorld, matTemp
D3DXMatrixIdentity matTemp
D3DXMatrixRotationZ matTemp, RotateAngle * (pi / 180) x
D3DXMatrixMultiply matWorld, matWorld, matTemp
D3DDevice.SetTransform D3DTS_WORLD, matWorld
Render
DoEvents
Loop

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن