نمایش نتایج 1 تا 22 از 22

نام تاپیک: آموزش DirectX-Graphic

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

    آموزش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

  2. #2
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

    در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •