|
موزشDirectX-Graphic قسمت هفتم
|
|
۸-۸-۱۳۸۶, ۱۲:۵۷ صبح
ارسال: #1
|
|||
|
|||
|
موزشDirectX-Graphic قسمت هفتم
تعريف ماترسها
1 - 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 راديان استفاده شده همچنين نسبت 1:1 استفاده شده است . قسمتهاي سوم و چهارم مشخص مي کنند فقط مثلثهايي کشيده شوند که با ابعاد بزرگتر از يکدهم دوربين و کوچکتر از ۵۰۰ برابر دوربين هستند . حال دستور اختصاص به 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 |
|||
کاربرانِ درحال بازدید از این موضوع: 1 مهمان
Persian MyBB : MyBBIran.com
Powered by MyBB | Copyright © 2009 MyBB Group
Element Blue by MyBB Mod | RTL by MyBBIran.com
Powered by MyBB | Copyright © 2009 MyBB Group
Element Blue by MyBB Mod | RTL by MyBBIran.com





