تبلیغات :
آکوستیک ، فوم شانه تخم مرغی، صداگیر ماینر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 4 از 6 اولاول 123456 آخرآخر
نمايش نتايج 31 به 40 از 51

نام تاپيک: مباحث پیشرفته و کاربردی در Vb

  1. #31
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزش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. #32
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزشDirectX-Graphic

    سلام

    آموزشDirectX-Graphic

    جلسه هشتم :

    موضوع : نورپردازي و اختصاص بافت به اشيا سه بعدي
    در اين درس مي خواهيم به مکعب درس قبل بافت اختصاص داده و نيز آنرا با يک منبع نور ، نورپردازي کنيم .
    ابتدا تايپ vertex ها را بصورت زير تعريف مي کنيم :


    Private Type UnlitVertex
    X As Single
    Y As Single
    Z As Single
    nx As Single
    ny As Single
    nz As Single
    tu As Single
    tv As Single
    End Type


    توصيفگر اين فرمت بصورت زير خواهد بود :


    Const Unlit_FVF = (D3DFVF_XYZ Or D3DFVF_NORMAL Or D3DFVF_TEX1)


    همچنين مکعب ما توسط ارايه زير مشخص مي شود :


    Dim Cube2(35) As UnlitVertex


    دو ثابت pi و rad را نيز بصورت زير تعريف مي کنيم :


    Const pi As Single = 3.141592
    Const Rad = pi / 180


    براي اختصاص بافت به مکعب ، از شي Direct3DTexture8 استفاده مي شود :


    Dim CubeTexture As Direct3DTexture8


    براي نورپردازي ، از شي D3DLIGHT8 استفاده مي شود :


    Dim Lights As D3DLIGHT8



    تغييرات مورد نياز در تابع Initialize
    بعد از ساخت شي D3DDevice در اين تابع ، پارامترهاي آنرا بصورت زير تنظيم مي کنيم :


    D3DDevice.SetVertexShader Unlit_FVF
    D3DDevice.SetRenderState D3DRS_LIGHTING, 1
    D3DDevice.SetRenderState D3DRS_ZENABLE, 1
    D3DDevice.SetRenderState D3DRS_AMBIENT, &H202020


    مقدار ambient يک کد هگزا RRGGBB است .
    بعد از دستورات فوق ماتريسهاي matworld ، matview و matproj مطابق مطابل درس قبل تعريف مي شوند . پس از آن بايستي بافت مکعب را از درون فايل تصويري مورد نظرتان load کنيد :


    Set CubeTexture = D3DX.CreateTextureFromFileEx(D3DDevice, yourfilename, 128, 128, D3DX_DEFAULT, 0, DispMode.Format, D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0, ByVal 0, ByVal 0)x


    حال بايستي تابع InitializeGeometry صدا زده شود و سپس تابع SetupLights فراخواني شوند . ابتدا به توضيح تابع InitializeGeometry مي پردازيم :


    Private Function InitialiseGeometry() As Boolean


    ابتدا يک بردار نرمال تعريف مي کنيم :


    Dim vN As D3DVECTOR


    سپس آرايه cube2 را با مقادير عددي پر مي کنيم . نرمالهاي تمام vertex ها را ابتدا با بردار
    [0,0,0 ] تعريف مي کنيم . اين مقدا بعداً تغيير خواهد کرد :


    Cube2(0) = CreateVertex(-1, -1, 1, 0, 0, 0, 0, 0)
    Cube2(1) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
    Cube2(2) = CreateVertex(-1, 1, 1, 0, 0, 0, 0, 1)
    vN = GenerateTriangleNormals(Cube2(0), Cube2(1), Cube2(2))
    Cube2(0).nx = vN.X: Cube2(0).ny = vN.Y: Cube2(0).nz = vN.Z
    Cube2(1).nx = vN.X: Cube2(1).ny = vN.Y: Cube2(1).nz = vN.Z
    Cube2(2).nx = vN.X: Cube2(2).ny = vN.Y: Cube2(2).nz = vN.Z


    Cube2(3) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
    Cube2(4) = CreateVertex(-1, -1, 1, 0, 0, 0, 0, 0)
    Cube2(5) = CreateVertex(1, -1, 1, 0, 0, 0, 1, 0)
    vN = GenerateTriangleNormals(Cube2(3), Cube2(4), Cube2(5))
    Cube2(3).nx = vN.X: Cube2(3).ny = vN.Y: Cube2(3).nz = vN.Z
    Cube2(4).nx = vN.X: Cube2(4).ny = vN.Y: Cube2(4).nz = vN.Z
    Cube2(5).nx = vN.X: Cube2(5).ny = vN.Y: Cube2(5).nz = vN.Z

    'Back
    Cube2(6) = CreateVertex(-1, 1, -1, 0, 0, 0, 0, 1)
    Cube2(7) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 1)
    Cube2(8) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
    vN = GenerateTriangleNormals(Cube2(6), Cube2(7), Cube2(8))
    Cube2(6).nx = vN.X: Cube2(6).ny = vN.Y: Cube2(6).nz = vN.Z
    Cube2(7).nx = vN.X: Cube2(7).ny = vN.Y: Cube2(7).nz = vN.Z
    Cube2(8).nx = vN.X: Cube2(8).ny = vN.Y: Cube2(8).nz = vN.Z

    Cube2(9) = CreateVertex(1, -1, -1, 0, 0, 0, 1, 0)
    Cube2(10) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
    Cube2(11) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 1)
    vN = GenerateTriangleNormals(Cube2(9), Cube2(10), Cube2(11))
    Cube2(9).nx = vN.X: Cube2(9).ny = vN.Y: Cube2(9).nz = vN.Z
    Cube2(10).nx = vN.X: Cube2(10).ny = vN.Y: Cube2(10).nz = vN.Z
    Cube2(11).nx = vN.X: Cube2(11).ny = vN.Y: Cube2(11).nz = vN.Z

    'Right
    Cube2(12) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
    Cube2(13) = CreateVertex(-1, 1, 1, 0, 0, 0, 1, 1)
    Cube2(14) = CreateVertex(-1, 1, -1, 0, 0, 0, 1, 0)
    vN = GenerateTriangleNormals(Cube2(12), Cube2(13), Cube2(14))
    Cube2(12).nx = vN.X: Cube2(12).ny = vN.Y: Cube2(12).nz = vN.Z
    Cube2(13).nx = vN.X: Cube2(13).ny = vN.Y: Cube2(13).nz = vN.Z
    Cube2(14).nx = vN.X: Cube2(14).ny = vN.Y: Cube2(14).nz = vN.Z

    Cube2(15) = CreateVertex(-1, 1, 1, 0, 0, 0, 1, 1)
    Cube2(16) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
    Cube2(17) = CreateVertex(-1, -1, 1, 0, 0, 0, 0, 1)
    vN = GenerateTriangleNormals(Cube2(15), Cube2(16), Cube2(17))
    Cube2(15).nx = vN.X: Cube2(15).ny = vN.Y: Cube2(15).nz = vN.Z
    Cube2(16).nx = vN.X: Cube2(16).ny = vN.Y: Cube2(16).nz = vN.Z
    Cube2(17).nx = vN.X: Cube2(17).ny = vN.Y: Cube2(17).nz = vN.Z

    'Left
    Cube2(18) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 0)
    Cube2(19) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
    Cube2(20) = CreateVertex(1, -1, -1, 0, 0, 0, 0, 0)
    vN = GenerateTriangleNormals(Cube2(18), Cube2(19), Cube2(20))
    Cube2(18).nx = vN.X: Cube2(18).ny = vN.Y: Cube2(18).nz = vN.Z
    Cube2(19).nx = vN.X: Cube2(19).ny = vN.Y: Cube2(19).nz = vN.Z
    Cube2(20).nx = vN.X: Cube2(20).ny = vN.Y: Cube2(20).nz = vN.Z

    Cube2(21) = CreateVertex(1, -1, 1, 0, 0, 0, 0, 1)
    Cube2(22) = CreateVertex(1, -1, -1, 0, 0, 0, 0, 0)
    Cube2(23) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
    vN = GenerateTriangleNormals(Cube2(21), Cube2(22), Cube2(23))
    Cube2(21).nx = vN.X: Cube2(21).ny = vN.Y: Cube2(21).nz = vN.Z
    Cube2(22).nx = vN.X: Cube2(22).ny = vN.Y: Cube2(22).nz = vN.Z
    Cube2(23).nx = vN.X: Cube2(23).ny = vN.Y: Cube2(23).nz = vN.Z

    'Top
    Cube2(24) = CreateVertex(-1, 1, 1, 0, 0, 0, 0, 1)
    Cube2(25) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
    Cube2(26) = CreateVertex(-1, 1, -1, 0, 0, 0, 0, 0)
    vN = GenerateTriangleNormals(Cube2(24), Cube2(25), Cube2(26))
    Cube2(24).nx = vN.X: Cube2(24).ny = vN.Y: Cube2(24).nz = vN.Z
    Cube2(25).nx = vN.X: Cube2(25).ny = vN.Y: Cube2(25).nz = vN.Z
    Cube2(26).nx = vN.X: Cube2(26).ny = vN.Y: Cube2(26).nz = vN.Z

    Cube2(27) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 0)
    Cube2(28) = CreateVertex(-1, 1, -1, 0, 0, 0, 0, 0)
    Cube2(29) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
    vN = GenerateTriangleNormals(Cube2(27), Cube2(28), Cube2(29))
    Cube2(27).nx = vN.X: Cube2(27).ny = vN.Y: Cube2(27).nz = vN.Z
    Cube2(28).nx = vN.X: Cube2(28).ny = vN.Y: Cube2(28).nz = vN.Z
    Cube2(29).nx = vN.X: Cube2(29).ny = vN.Y: Cube2(29).nz = vN.Z

    'Top
    Cube2(30) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
    Cube2(31) = CreateVertex(1, -1, 1, 0, 0, 0, 1, 1)
    Cube2(32) = CreateVertex(-1, -1, 1, 0, 0, 0, 0, 1)
    vN = GenerateTriangleNormals(Cube2(30), Cube2(31), Cube2(32))
    Cube2(30).nx = vN.X: Cube2(30).ny = vN.Y: Cube2(30).nz = vN.Z
    Cube2(31).nx = vN.X: Cube2(31).ny = vN.Y: Cube2(31).nz = vN.Z
    Cube2(32).nx = vN.X: Cube2(32).ny = vN.Y: Cube2(32).nz = vN.Z

    Cube2(33) = CreateVertex(1, -1, 1, 0, 0, 0, 1, 1)
    Cube2(34) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
    Cube2(35) = CreateVertex(1, -1, -1, 0, 0, 0, 1, 0)
    vN = GenerateTriangleNormals(Cube2(33), Cube2(34), Cube2(35))
    Cube2(33).nx = vN.X: Cube2(33).ny = vN.Y: Cube2(33).nz = vN.Z
    Cube2(34).nx = vN.X: Cube2(34).ny = vN.Y: Cube2(34).nz = vN.Z
    Cube2(35).nx = vN.X: Cube2(35).ny = vN.Y: Cube2(35).nz = vN.Z


    سپس يک بافر vertex خالي با ساير موردنظر مي سازيم :


    Set VBuffer = D3DDevice.CreateVertexBuffer(Len(Cube2(0)) * 36, 0, Unlit_FVF, D3DPOOL_DEFAULT)x


    سپس اين بافر vertex ساخته شده را با داده هاي cube2 پر مي کنيم :


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


    در دستورات فوق تابعي با نام GenerateTraingleNormals استفاده شده است . اين تابع دو بردار را از روي سه vertex داده شده با آن مي سازد و سپس ضرب برداري ايندو را حساب مي کند و سپس بردار حاصله را نرمال مي نمايد :


    Private Function GenerateTriangleNormals(p0 As UnlitVertex, p1 As UnlitVertex, p2 As UnlitVertex) As D3DVECTOR
    Dim v01 As D3DVECTOR 'Vector from points 0 to 1
    Dim v02 As D3DVECTOR 'Vector from points 0 to 2
    Dim vNorm As D3DVECTOR 'The final vector

    'Create the vectors from points 0 to 1 and 0 to 2
    D3DXVec3Subtract v01, MakeVector(p1.X, p1.Y, p1.Z), MakeVector(p0.X, p0.Y, p0.Z)
    D3DXVec3Subtract v02, MakeVector(p2.X, p2.Y, p2.Z), MakeVector(p0.X, p0.Y, p0.Z)

    'Get the cross product
    D3DXVec3Cross vNorm, v01, v02

    'Normalize this vector
    D3DXVec3Normalize vNorm, vNorm

    'Return the value
    GenerateTriangleNormals.X = vNorm.X
    GenerateTriangleNormals.Y = vNorm.Y
    GenerateTriangleNormals.Z = vNorm.Z
    End Function



    حال به توضيح تابع SetupLights مي پردازيم . در اين تابع دو شي D3DMATERIAL8 و D3DCOLORVALUE استفاده شده است :


    Private Function SetupLights() As Boolean
    Dim Mtrl As D3DMATERIAL8, Col As D3DCOLORVALUE
    Col.a = 1: Col.r = 1: Col.g = 1: Col.b = 1
    Mtrl.Ambient = Col
    Mtrl.diffuse = Col
    D3DDevice.SetMaterial Mtrl

    Lights.Type = D3DLIGHT_DIRECTIONAL
    Lights.diffuse.r = 1
    Lights.diffuse.g = 1
    Lights.diffuse.b = 1
    Lights.Direction = MakeVector(1, -1, 0)

    D3DDevice.SetLight 0, Lights

    SetupLights = True
    End Function



    تابع Render بصورت زير است :


    Public Sub Render()
    D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0 '//Clear the screen black
    D3DDevice.BeginScene
    'Draw the cube
    D3DDevice.SetTexture 0, CubeTexture
    D3DDevice.SetStreamSource 0, VBuffer, Len(Cube2(0))
    D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 12
    D3DDevice.EndScene
    D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
    End Sub



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


    Call Initialise
    Do While bRunning
    RotateAngle = RotateAngle + 0.1
    If RotateAngle >= 360 Then RotateAngle = RotateAngle - 360

    D3DXMatrixIdentity matWorld

    D3DXMatrixIdentity matTemp
    D3DXMatrixRotationX matTemp, RotateAngle * (pi / 180)
    D3DXMatrixMultiply matWorld, matWorld, matTemp

    D3DXMatrixIdentity matTemp
    D3DXMatrixRotationY matTemp, RotateAngle * (pi / 180)
    D3DXMatrixMultiply matWorld, matWorld, matTemp

    D3DXMatrixIdentity matTemp
    D3DXMatrixRotationZ matTemp, RotateAngle * (pi / 180)
    D3DXMatrixMultiply matWorld, matWorld, matTemp


    D3DDevice.SetTransform D3DTS_WORLD, matWorld

    D3DDevice.LightEnable 0, 0 خاموش کردن light

    D3DDevice.LightEnable 0, 1 روشن کردن light

    Render
    DoEvents
    Loop


    در متد D3DDevice.LightEnable پارامتر اول شماره منبع نور و پارمتر دوم enable بودن آنرا نشان مي دهد .

  3. #33
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزش DirectX-Graphic

    سلام

    آموزش DirectX-Graphic

    جلسه نهم :

    موضوع :‌ترسيم متن دو بعدي در DirectX

    در اين درس روش ترسيم متن با دو نوع فونت را نشان خواهم داد :
    براي رسم يک متن با فونت تعريف شده در سيستم از شي D3DXFont استفاده مي کنيم :


    Dim MainFont as D3DXFont
    Dim MainFontDesc as IFont
    Dim TextRect as RECT
    Dim fnt as new stdFont


    در حاليکه براي ايجاد يک متن با فونت custom ابتدا يک texture تعريف مي کنيم :


    Dim fntTex as Direct3DTexture8


    همچنين براي ترسيم هر کاراکتر يک آرايه vertex اي را از نوع TLVERTEX تعريف مي نمائيم :


    Dim vertchar(3) as TLVERTEX


    حال به سراغ تابع Initialize مي رويم . در اين تابع ابتدا دستورات مربوط به ايجاد اشيا D3D و D3Dx را قرا دهيد سپس دستورات مربوط به اختصاص آداپتور و نيز ايجاد شي D3DDevice را انجام مي دهيم . حال دستورات تنظيم shader و rendering را مي آوريم :


    D3DDevice.SetVertexShader TL_FVF
    D3DDevice.SetRenderState D3DRS_LIGHTING, False


    سپس تنظيمات پارامترهاي transparency براي rendering را انجام مي دهيم :


    D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
    D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
    D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, True


    حال بايستي textureرا طوري ----- کنيم که در زمان stretch شدن يا squash شدن بهتر بنظر برسد :


    D3DDevice.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
    D3DDevice.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR


    حال ----- Z را فعال مي کنيم :


    D3DDevice.SetRenderState D3DRS_ZENABLE, 1


    سپس ماتريسهاي world ، view و projection را تنظيم مي کنيم :


    D3DXMatrixIdentity matWorld
    D3DDevice.SetTransform D3DTS_WORLD, matWorld
    D3DXMatrixLookAtLH matView, MakeVector(0, 9, -9), MakeVector(0, 0, 0), MakeVector(0, 1, 0)
    D3DDevice.SetTransform D3DTS_VIEW, matView
    D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500
    D3DDevice.SetTransform D3DTS_PROJECTION, matProj


    حال به بخش تنظيم پارامترهاي فونت مي رسيم . در مورد فونت دو بعدي عادي :


    fnt.Name = "Verdana"x
    fnt.Size = 18
    fnt.Bold = True
    Set MainFontDesc = fnt
    Set MainFont = D3DX.CreateFont(D3DDevice, MainFontDesc.hFont)x


    و در مورد فونت custom :


    Set fntTex = D3DX.CreateTextureFromFileEx(D3DDevice, yourfilename, 256, 128, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_POINT, D3DX_FILTER_POINT, &HFF00FF00, ByVal 0, ByVal 0)x
    end function


    روتين Render بصورت زير خواهد بود :


    Public Sub Render()x
    D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0
    D3DDevice.BeginScene


    براي رندر متن با فونت عادي بصورت زير عمل مي کنيم :


    TextRect.Top = 440
    TextRect.Left = 1
    TextRect.bottom = 480
    TextRect.Right = 640
    D3DX.DrawText MainFont, &HFFCCCCFF, "Current Frame Rate: " & FPS_Current, TextRect, DT_TOP Or DT_CENTER


    براي رندر متن با فونت custom بصورت زير عمل مي کنيم :


    RenderStringFromCustomFont_2D "Hamed Sheidaian", 1, 1, 16, 16
    D3DDevice.EndScene
    D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
    End Sub


    همانطور که مشاهده مي کنيد از روتيني با نام RenderStringFromCustomFont_2D استفاده شده است :


    Private Sub RenderStringFromCustomFont_2D(strText As String, startX As Single, StartY As Single, Height As Integer, Width As Integer)x
    Dim I As Integer
    Dim CharX As Integer, CharY As Integer
    Dim Char As String
    Dim LinearEntry As Integer
    If Len(strText) = 0 Then Exit Sub
    For I = 1 To Len(strText)x


    1 - ابتدا بايستي مختصات texture را انتخاب کنيم . براي اينکار بايستي هر entry را در texture جدا کنيم :


    Char = Mid$(strText, I, 1)x
    If Asc(Char) >= 65 And Asc(Char) <= 90 Then
    LinearEntry = Asc(Char) - 65
    ElseIf Asc(Char) >= 97 And Asc(Char) <= 122 Then
    LinearEntry = Asc(Char) - 71
    ElseIf Asc(Char) >= 48 And Asc(Char) <= 57 Then
    LinearEntry = Asc(Char) + 4
    ElseIf Char = " " Then
    LinearEntry = 63
    ElseIf Char = "." Then
    LinearEntry = 62
    ElseIf Char = ";" Then
    LinearEntry = 66
    ElseIf Char = "/" Then
    LinearEntry = 64
    ElseIf Char = "," Then
    LinearEntry = 65
    End If


    بعد از مقداردهي LinearEntry بايستي مختصات grid کاراکتر را پردازش کنيم :


    If LinearEntry <= 15 Then
    CharY = 0
    CharX = LinearEntry
    End If
    If LinearEntry >= 16 And LinearEntry <= 31 Then
    CharY = 1
    CharX = LinearEntry - 16
    End If
    If LinearEntry >= 32 And LinearEntry <= 47 Then
    CharY = 2
    CharX = LinearEntry - 32
    End If
    If LinearEntry >= 48 And LinearEntry <= 63 Then
    CharY = 3
    CharX = LinearEntry - 48
    End If
    If LinearEntry >= 64 And LinearEntry <= 79 Then
    CharY = 4
    CharX = LinearEntry - 64
    End If


    ۲ - حال بايستي vertex هاي مورد نياز براي رسم کاراکتر را توليد کنيم :


    vertChar(0) = CreateTLVertex(startX + (Width * I), StartY, 0, 1, &HFFFFF
    (F,0,(1/16)*CharX,(1/8)*CharY
    vertChar(1) = CreateTLVertex(startX + (Width * I) + Width, StartY, 0, 1, &HFFFFF
    (F, 0,((1 / 16) * CharX) + (1 / 16), (1 / 8) * CharY
    vertChar(2) = CreateTLVertex(startX + (Width * I), StartY + Height, 0, 1, &HFFFFF
    ((F, 0, (1 / 16) * CharX, ((1 / 8) * CharY) + (1 / 8
    vertChar(3) = CreateTLVertex(startX + (Width * I) + Width, StartY + Height, 0, 1, HFFFFFF, 0, ((1 / 16) * CharX) + (1 / 16), ((1 / 8) * CharY) + (1 / 8))x


    ۳ - رندر vertex ها :


    D3DDevice.SetTexture 0, fntTex
    D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, vertChar(0), Len(vertChar(0))x
    Next I
    End Sub

  4. #34
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزشDirectX-Graphic

    سلام

    آموزشDirectX-Graphic

    جلسه دهم (پایان)

    موضوع : ترسيم اشيا سه بعدي با استفاده از شي Mesh
    شي Mesh که جزو اشيا D3DX مي باشد امکان ترسيم اشيا سه بعدي پايه و همچنين ترسيم مش هاي custom دلخواه را به شما مي دهد . در اين درس از شي Mesh براي ترسيم يک کره ( sphere ) استفاده مي کنيم . ابتدا متغير sphere را بصورت زير تعريف کنيد :


    Dim sphere as D3DXMesh


    همچنين براي نورپردازي و اختصاص material به کره به متغيرهاي زير نياز داريم :


    Dim d3dLight As D3DLIGHT8
    Dim material As D3DMATERIAL8
    Dim Col As D3DCOLORVALUE


    در تابع Initial پس از ساخت اشيا D3D و D3DX و D3DDevice بايستي پارامترهاي رنگ ، نورپردازي و اختصاص ماده ( material ) به کره را بصورت زير تنظيم کنيد :


    Col.a = 1
    Col.b = 1
    Col.g = 1
    Col.r = 1
    d3dLight.Type = D3DLIGHT_DIRECTIONAL
    d3dLight.diffuse = Col
    d3dLight.Direction = vec(-1, -1, -1)x


    نورپردازي از نوع جهت دار با رنگ col و بردار جهت (1-,1-,1-) است .
    نکته :
    رنگ ambient رنگي است که هنگاميکه جسم در سايه باشد به خود مي گيرد . بعبارت ديگر اين رنگ را جسم وقتي که در معرض يک نور ambient باشد از خود منعکس مي کند .
    رنگ diffuse رنگي است که هنگاميکه جسم در معرض نور مستقيم قرار بگيرد از خود منعکس مي کند .


    material.Ambient = Col
    material.diffuse = Col
    d3dDevice.SetMaterial material
    d3dDevice.SetLight 0, d3dLight
    d3dDevice.LightEnable 0, 1


    سپس بايستي پارامترهاي rendering را تنظيم کنيد :


    d3dDevice.SetRenderState D3DRS_LIGHTING, 1
    d3dDevice.SetRenderState D3DRS_ZENABLE, 1
    d3dDevice.SetRenderState D3DRS_LIGHTING, 1
    d3dDevice.SetRenderState D3DRS_ZENABLE, 1
    d3dDevice.SetRenderState D3DRS_SHADEMODE, D3DSHADE_GOURAUD
    d3dDevice.SetRenderState D3DRS_AMBIENT, &H202020
    d3dDevice.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
    d3dDevice.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR


    حال بايستي شي sphere را بسازيم :


    Set Sphere = d3dx.CreateSphere(d3dDevice, 2, 1000, 20, Nothing)x


    که ۲ شعاع کره و ۱۰۰۰ تعداد slice هايي است که کره با آن ساخته مي شود .
    سپس بردارهاي نقطه ديد و مکان دوربين و رنگ زمينه را تنظيم کنيد ( viewpoint و camerapoint از نوع D3DVECTOR هستند ) .


    ViewPoint = vec(0, 0, 0)
    CameraPoint = vec(4, 4, 4)
    BackColor = &H404040


    در روتين Render ابتدا ماتريسها و بردارهاي صحنه را تنظيم مي کنيم :


    D3DXMatrixIdentity matWorld
    d3dDevice.SetTransform D3DTS_WORLD, matWorld
    D3DXMatrixRotationY matView, Rotation
    D3DXMatrixLookAtLH matTemp, CameraPoint, ViewPoint, vec(0, 1, 0)
    D3DXMatrixMultiply matView, matView, matTemp
    d3dDevice.SetTransform D3DTS_VIEW, matView
    D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500
    d3dDevice.SetTransform D3DTS_PROJECTION, matProj


    در پايان نيز شروع به رندر صحنه مي کنيم :


    d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, BackColor, 1, 0
    d3dDevice.BeginScene
    Sphere.DrawSubset 0
    d3dDevice.EndScene
    d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0

  5. #35
    اگه نباشه جاش خالی می مونه siadate's Avatar
    تاريخ عضويت
    Apr 2006
    محل سكونت
    مشهد مقدس
    پست ها
    345

    پيش فرض تشکر وقدردانی

    با تشکر ا زشما دوست عزیز : A_M_IT2005

    امیدوارم ادامه داشته باشد

  6. #36
    داره خودمونی میشه
    تاريخ عضويت
    Dec 2005
    پست ها
    93

    پيش فرض

    چطوری میشه داخل رجیستری اطلاعات را ذخیره کرد حذف کرد و دریافت کرد؟

    این همه کار ؟میخواهم براتون یک مطلب توپ آموزش بدم که شاید هیچ کدوم از شما ندونید که چطوری میشه بدون API))و توابع چند صد خطی با سه خط برنامه بدون تعریف هیچ تابعی و... با یک دستور داخلی ویژوال بیسیک اطلاعات برنامه هاتون را داخل رجیستری که امن ترین مکان هست ذخیره کنید بازیابی کنید و حتی حذف کنید.خب شما باید از تابع (((SaveSetting))) برای ذخیره اطلاعات استفاده کنید . از تابع (((GetSetting))) اطلاعات را دریافت کنید و از طریق (((DeleteSetting))) آن را حذف کنید تعجب نکنید به همین راحتی خب برنامه هم به این شرح است(ذخیره کردن):


    SaveSetting App.Title, "Startup", "Message", "mehrdad-xvc"
    چون وقت ندارم که بگم اطلاعات کجا ذخیره میشوند داخل رجیستری شده روی اولین گزینه کلیک کرده و کلمه mehrdad-xvc را جستجو کنید حتما خواهید فهمید چه اتفاقاتی رخ داده !


    بعد از درک مطلب بالا این هم توابع خواندن و حذف کردن خیلی ساده و راحت!


    دریافت

    MsgBox GetSetting(App.Title, "Startup", "Message", "Hello")

    حذف

    DeleteSetting App.Title, "Startup", "Message"
    این تابع خیلی ساده هست ولی ایرادهایی هم داره خودتون خواهید فهمید.

    کارش برگرداندن نام پروژه هست.App.titleتابع

  7. #37
    اگه نباشه جاش خالی می مونه
    تاريخ عضويت
    Aug 2004
    محل سكونت
    روسیه
    پست ها
    300

    پيش فرض

    عزیز چه کردی!!!! کارت حرف نداره ادامه لطفا

  8. #38
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض

    سلام دوستان
    واقعا خوشحالم که مطالب و جلسات برای شما مفید بوده.
    از mehrdad-xvc هم به خاطر مطلبی که قرار دادند تشکر میکنم.
    از همه وی بی کاران عزیز درخواست میکنم که سوالاشونو در این تاپیک نپرسن.
    این تاپیک مثل یک کتابه. من این تاپیکو برای همین زدم که مطالب در مورد وی بی جامع و کامل باشه.
    اگه سوالی دارید :
    1. اول در سایت جستجو کنید.
    2. اگه سوال شما پرسیده نشده بود و جواب خودتونو پیدا نکردید ، یه تاپیک ایجاد کنید.
    ممنون.

  9. #39
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض ايجاد ساختارهاي داده اي در ويژوال بيسيک

    سلام

    ايجاد ساختارهاي داده اي در ويژوال بيسيک

    جلسه اول :

    مقدمه :

    ساختارهاي داده اي از نظر تعداد اعضا به دو دسته استاتيک و ديناميک تقسيم مي شوند . ساختارهاي استاتيک مثل آرايه هاي يک بعدي و آرايه هاي دو بعدي ، تعداد اعضاي آنها در زمان طراحي برنامه مشخص مي شود و در طول اجراي برنامه ثابت است اما تعداد اعضاي ساختارهاي داده اي ديناميک در طول اجراي برنامه تغيير مي کند . ليست پيوندي ( LinkList ) ، پشته ( Stack ) ، صف ( Queue ) و درختهاي باينري ( Tree Binary) ، نمونه هايي از ساختارهاي داده اي ديناميک هستند .
    ليست پيوندي شامل مجموعه اي از عناصر داده اي است که اضافه و حذف اعضا در هر جاي ليست ممکن است .
    پشته يک ساختار داده اي مهم در کامپايلرها و سيستم هاي عامل است که عمل اضافه و حذف عناصر از ابتداي آن انجام مي شود .
    صف يک ساختار داده اي است که عمل اضافه کردن از انتها و عمل حذف کردن از ابتداي آن انجام مي شود .
    درختهاي دودويي براي جستجوي بسيار سريع ، ذخيره سازي داده ها و کامپايل عبارات استفاده مي شوند .

    نوع داده Variant :

    نوع داده variant براي متغيرهايي بکار مي رود که بطور صريح نوع آنها تعريف نشده است مثال :
    Dim value As Variant
    اين نوع داده مي تواند هر نوع داده اي را در خود ذخيره کند . همچنين براي ايجاد ساختارهاي داده اي مثل ليست هاي پيوندي ، صف ، پشته و درخت مناسب است .
    نوع داده موجود در variant مي توان توسط توابع VarType و TypeName تعيين کرد . تابع VarType يک مقدار صحيح برمي گرداند که نشان دهنده نوع ذخيره شده در variant است .
    مثال :
    Dim value as Variant
    value=”Hello”x
    در اينصورت مقدار بازگشتي ( VarType( value برابر 4 خواهد بود .
    تابع TypeName يک رشته برمي گرداند که نشان دهنده نام نوع داده ذخيره شده در variant است .

    اخذ حافظه بطور ديناميک Dynamic Memory Allocation :

    براي ايجاد و نگهداري ساختارهاي داده اي ديناميک بايستي در هنگام اجراي برنامه بتوان فضاي بيشتري براي نگهداري داده هاي جديد بدست آورد . با استفاده از کلمه کليدي New مي توان در ويژوال بيسيک حاقظه ديناميک گرفت :
    Set NewNode=New ListNode
    که ListNode يک شي از ساختار داده اي مورد نظر ماست .

    کلاسهاي خود ارجاعي :

    کلاس خودارجاعي نوعي کلاس است که داراي يک اشاره گر ( Pointer ) به يک شي از همان نوع کلاس باشد . براي مثال اگر کلاس ما به اسم ClistNode باشد و متغير زير را در آن تعريف کنيم ، اين کلاس يک کلاس خود ارجاعي است :
    Private mNextNode as ClistNode
    از mNextNode براي لينک دادن اعضاي يک ساختار داده اي ديناميک بهم استفاده مي شود ( بعبارت ديگر گره زدن يک شي از کلاس ClistNode به يک شي ديگر از همان کلاس ) . شي هاي خودارجاعي مي توانند به همديگر لينک شوند و ساختارهاي داده اي مثل ليست پيوندي ، صف ، پشته و درخت را ايجاد کنند .
    شکل زير دو شي خود ارجاعي را نشان مي دهد که بصورت يک ليست بهم لينک شده اند . عبارت NULL بدين معنا است که شي خودارجاعي به شي ديگري اشاره نمي کند ( Nothing ) و نشان دهنده انتهاي ساختار داده است .

  10. #40
    Banned
    تاريخ عضويت
    Mar 2007
    محل سكونت
    Forum.p30world
    پست ها
    1,546

    پيش فرض

    ببخشيد از افراد این تاپيک خواهش ميکنم که متالبشون رو به صورت پی دی اف بزارند که راهتّر بشه ازشون استفاده کرد ممنون

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •