نام کاربری: گذرواژه‌:
انجمن فناوری اطلاعات دانشگاه پیام نور تبلیغات


تعرفه تبلیغات در IT98

ساخت يک موتور گرافيکي سه بعدي

برچسب‌های کلیدی این موضوع:
کاربران در حال بازدید از این موضوع: 1 مهمان
آخرین ارسال کننده: *setayesh
ارسال‌ها: 1
بازدیدها: 2148
امتیاز دهید
 
  • 0 رأی - میانگین امیتازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
در گوگل محبوب کنید
انجمن فناوری اطلاعات دانشگاه پیام نور


ساخت يک موتور گرافيکي سه بعدي

کاربر فعال
تاریخ عضویت: آذر ۱۳۹۲
رشته: کامپیوتر نرم افزار
ترم: شش
دانشگاه: پیام نور
اعتبار: 17
ارسال‌ها: 72
وضعیت : آفلاین
جنسیت: دختر
سپاس ها 116
سپاس شده 33 بار در 25 ارسال
ارسال: #1
ایجاد شده در تاریخ: ۱۸-۹-۱۳۹۳ ۱۱:۵۸ عصر
ساخت يک موتور گرافيکي سه بعدي



قبل از شروع مباحث جديد برنامه نويسي Direct3D ، با هم مروري بر مباحث قبلي خواهيم داشت . ( مباحث قبلي در آرشيو موجود مي باشند ) .

در اين درس با استفاده از مطالب قبلي يک Engine سه بعدي ساخته و از امکانات آن در يک برنامه نمونه استفاده خواهيم کرد .

اين engine داراي دو کلاس است :

1 – کلاس MainD3D

2 – کلاس D3Dobject

در کلاس MainD3D متغيرها و توابع لازم براي ساخت يک device سه بعدي ، تنظيمات ماتريسي ، تابع رندر و غيره موجود مي باشد .

متغيرهاي عمومي اين کلاس عبارتند از :

Public g_DX As New DirectX8

Public g_D3D As Direct3D8

Public g_D3DX As New D3DX8

Public g_D3DDevice As Direct3DDevice8

Public NTextures As Long

روتين ها و توابع اين کلاس عبارتند از :

1 - InitD3D : اين روتين ، اشيا D3D و D3Ddevice را مي سازد و پارامترهاي آنها را تنظيم مي کند .

2 – ApplyCameraChanges : روتين ايجاد ماتريس View

3 – SetupMatrices : روتين ايجاد ماتريس Projection

4 – StartRender : در اين روتين عمليات لازم براي شروع عمل رندر صورت مي گيرد .

5 – RenderObject : اين تابع ، يک شي سه بعدي از نوع کلاس D3Dobject را مي
گيرد و بردارهاي مورد نياز و نيز بافت شي را تنظيم مي کند و در پايان شي را
ترسيم مي کند .

6 – FinishRender : در اين روتين به عمليات رندر پايان داده مي شود .

7 – Cleanup: روتين از بين بردن اشيا Direct3D

8 – CreateVector : تابع ساخت يک بردار سه بعدي

9 – CreateTextures : روتين ساخت يک بافت جديد

10 – InitTexture: تابع مقداردهي به يک بافت

در کلاس D3Dobject متغيرها و توابع لازم براي ايجاد يک شي سه بعدي و اختصاص بافت به آن موجود مي باشد .

در اين کلاس دو type عمومي تعريف شده است :

1 - NormalVERTEX

2 - TeturedVERTEX

همچنين روتين ها و توابع اين کلاس عبارتند از :

1 – InitObject : تابعي که تنظيمات اوليه vertex ها و بافت شي را انجام مي دهد .

2 – Vertex : روتين ايجاد vertex هاي مورد نياز

3 – GetRenderingMode: تابعي که مد رندر را مشخص مي کند .

و نيز يکسري تابع ساخت vertex نرمال و ساخت vertex داراي بافت و غيره



اين دو کلاس در يک پروژه ويژوال بيسيک قرارداده شده و پروژه با نام D3Dengine.dll کامپايل شده است .

حال با استفاده از اين engine مي خواهيم يک منظره سه بعدي را ايجاد کنيم :

اين منظره شامل سه object است : ديوار ، آسمان و زمين.









ابتدا بايد يک شي از کلاس MainD3D تعريف کنيم :



Dim D3D8Main As MainD3D8



در متد Form Load نيز سه شي Floor ، Sky و Wall را بصورت زير تعريف مي کنيم :



Dim Floor As D3DObject

Dim Sky As D3DObject

Dim Walls As D3Dobject





سپس اين سه شي را به اضافه شي D3D8Main ، ايجاد مي کنيم :



Set D3D8Main = New D3DEngine.MainD3D8

Set Floor = New D3DEngine.D3DObject

Set Sky = New D3DEngine.D3DObject

Set Walls = New D3DEngine.D3Dobject



در ابتدا شي MainD3D را Initial مي کنيم و سپس بافتهاي مورد نيز خود را مي سازيم :



D3D8Main.InitD3D True, Me.hWnd

D3D8Main.CreateTextures 3

D3D8Main.InitTexture 1, App.Path + "\floor.jpg"

D3D8Main.InitTexture 2, App.Path + "\sky.bmp"

D3D8Main.InitTexture 3, App.Path + "\wall.bmp"





حال به سراغ ايجاد و مقداردهي vertex هاي floor مي رويم . floor شامل شش vertex مي باشد و بنابراين دو face مثلثي دارد :



Floor.InitObject 6, 2, TriangleList, True, 1



Floor.Vertex 0, -55, -2, -55, vbWhite, 0, 10

Floor.Vertex 1, 55, -2, -55, vbWhite, 10, 10

Floor.Vertex 2, 55, -2, 55, vbWhite, 10, 0

Floor.Vertex 3, -55, -2, -55, vbWhite, 0, 10

Floor.Vertex 4, 55, -2, 55, vbWhite, 10, 0

Floor.Vertex 5, -55, -2, 55, vbWhite, 0, 0



سپس به سراغ ايجاد و مقداردهي vertex هاي wall مي رويم . wall شامل بيست و چهار vertex مي باشد و بنابراين هشت face مثلثي دارد :



Walls.InitObject 24, 8, TriangleList, True, 3



Walls.Vertex 0, -55, -2, -55, &HBCE8FC, 0, 1

Walls.Vertex 1, 55, -2, -55, &HBCE8FC, 5, 1

Walls.Vertex 2, 55, 8, -55, &HBCE8FC, 5, 0

Walls.Vertex 3, -55, -2, -55, &HBCE8FC, 0, 1

Walls.Vertex 4, 55, 8, -55, &HBCE8FC, 5, 0

Walls.Vertex 5, -55, 8, -55, &HBCE8FC, 0, 0



Walls.Vertex 6, -55, -2, 55, &HBCE8FC, 0, 1

Walls.Vertex 7, 55, -2, 55, &HBCE8FC, 5, 1

Walls.Vertex 8, 55, 8, 55, &HBCE8FC, 5, 0

Walls.Vertex 9, -55, -2, 55, &HBCE8FC, 0, 1

Walls.Vertex 10, 55, 8, 55, &HBCE8FC, 5, 0

Walls.Vertex 11, -55, 8, 55, &HBCE8FC, 0, 0



Walls.Vertex 12, -55, -2, 55, &HBCE8FC, 0, 1

Walls.Vertex 13, -55, -2, -55, &HBCE8FC, 5, 1

Walls.Vertex 14, -55, 8, -55, &HBCE8FC, 5, 0

Walls.Vertex 15, -55, -2, 55, &HBCE8FC, 0, 1

Walls.Vertex 16, -55, 8, -55, &HBCE8FC, 5, 0

Walls.Vertex 17, -55, 8, 55, &HBCE8FC, 0, 0



Walls.Vertex 18, 55, -2, 55, &HBCE8FC, 0, 1

Walls.Vertex 19, 55, -2, -55, &HBCE8FC, 5, 1

Walls.Vertex 20, 55, 8, -55, &HBCE8FC, 5, 0

Walls.Vertex 21, 55, -2, 55, &HBCE8FC, 0, 1

Walls.Vertex 22, 55, 8, -55, &HBCE8FC, 5, 0

Walls.Vertex 23, 55, 8, 55, &HBCE8FC, 0, 0





حال به سراغ ايجاد و مقداردهي vertex هاي sky مي رويم . sky شامل شش vertex مي باشد و بنابراين دو face مثلثي دارد :



Sky.InitObject 6, 2, TriangleList, True, 2



Sky.Vertex 0, -55, 8, -55, &HBCE8FC, 0, 1

Sky.Vertex 1, 55, 8, -55, &HBCE8FC, 0, 1

Sky.Vertex 2, 55, 8, 55, &HBCE8FC, 0, 1

Sky.Vertex 3, -55, 8, -55, &HBCE8FC, 0, 1

Sky.Vertex 4, 55, 8, 55, &HBCE8FC, 0, 1

Sky.Vertex 5, -55, 8, 55, &HBCE8FC, 0, 1





در پايان تابع رندر را صدا مي کنيم . البته در هر بار عمل رندر کردن ،
دوربين يک درجه در صفحه X-Z دوران مي کند تا کل ديوار قابل مشاهده باشد :



Dim Angle As Double

PI = 3.1415

Angle = 0

Do

DoEvents

D3D8Main.StartRender vbBlack

D3D8Main.RenderObject Sky

D3D8Main.RenderObject Floor

D3D8Main.RenderObject Walls

D3D8Main.FinishRender

If Sqr(Angle ^ 2) = 360 Then Angle = 0

Angle = Angle + 1

D3D8Main.CamLookAtX = Sin((Angle * 2 * PI) / 360)

D3D8Main.CamLookAtZ = Cos((Angle * 2 * PI) / 360)

D3D8Main.ApplyCameraChanges

loop

امضا *setayesh
آنکه دنبال حیات ابدی می گردید

کاش یک تا دو قدم

به سوی ظلمت چشم تو قدم بر می داشت

و به یک جرعه ی آن

ابدی می گردید

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


پرش به انجمن:

شبکه‌های اجتماعی درباره ما لینک‌های مهم ابزار
انجمن فناوري اطلاعات دانشگاه پيام‌نور در سال 1389 با هدف رشد و ارتقاي علمي دانشجويان آغاز بکار کرد. در IT98 شما قادرید از کاملترین و بروزترین آرشیو نمونه‌سوالات، جزوات، حل تمرینات، گزارش آزمایشگاه، گزارش کارآموزی، پروژه، مقالات و پایان‌نامه استفاده کنید. IT98.ir با عنوان بزرگترین انجمن دانشجویی رشته کامپیوتر دانشگاه پیام‌نور شناخته میشود.
Copyright (c) 2010-2017 it98.iR, all rights reserved
Template designed by : Mehdi Dastkhosh , Powered by MyBB
صفحه اصلی جستجو بازیهای آنلاین لیست اعضا