PDA

View Full Version : ارتباط بین #C و یک برنامه گرافیکی مثل 3D MaX



saber4166
پنج شنبه 17 اردیبهشت 1388, 19:24 عصر
سلام بر دوستان
کسی میتونه بنده رو در مورد ارتباط بین #C و یک برنامه گرافیکی مثل 3D MaX راهنمایی کنه اگر نمونه ای هم مثال بزنید بسیار ممنون میشم
با تشکر از همه اساتید

aliila
پنج شنبه 17 اردیبهشت 1388, 21:41 عصر
اين يه مثال تو vb6

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

مباحث جديد برنامه نويسي Direct3D
اين 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

saber4166
شنبه 19 اردیبهشت 1388, 19:53 عصر
از دوستان کسی میتونه بنده رو در مورد Open GL راهنمایی کنه؟؟؟

saber4166
یک شنبه 20 اردیبهشت 1388, 00:51 صبح
دوست عزیز من نمی خوام گرافیک بزنم در واقع می خواهم 3D Max رو توی برنامم فراخوانی کنم
این طور که من متوجه شدم شما یک محیط گرافیکی میسازید ولی من فقط می خوام فرا خوانی
کنم و ازش استفاده کنم
اگر برداشت نادرستی از کد هاتون داشتم خواهشن بهم بگید و راهنمایی کنید با کمال تشکر.

aminM#
یک شنبه 20 اردیبهشت 1388, 09:30 صبح
شما بايد از بخش Add Refrence منابع Com منابع مربوط به 3dmax رو به برنامه اضافه كرده با Object browser بايد كلاس ها و متدها رو ببينيد و كلاس ها و توابع مورد نيازتون رو انتخاب كرده و به راحتي روش استفاده از اون كلاس يا متد رو توي اينترنت مي تونين پيدا كنين موفق باشين.

saber4166
یک شنبه 20 اردیبهشت 1388, 21:41 عصر
میشه بیشتر راهنمایی کنید ؟ ممنون میشم

aminM#
دوشنبه 21 اردیبهشت 1388, 15:37 عصر
دقيق تر بگين كجاش مبهمه

saber4166
سه شنبه 22 اردیبهشت 1388, 17:39 عصر
در مورد توابع و کلاس های گرافیک و طریقه ی فرا خوانی و چه طور کد هامو به او کلاس ها وا بسته کنم
تا حالات 3 بعدی کاملا مشهود باشه

و نکته مهم تر اینکه بر نامم سنگین نشه یعنی روی سیستم های خونگی مختلفی درست کار کنه

aminM#
پنج شنبه 24 اردیبهشت 1388, 11:13 صبح
طبیعی که برنامه شما بسته به عملکرد مورد نظر سنگین می شه و اما درمورد سوال شما ، بعد از افزودن رفرنس ها در سلو شن ( یعنی مرحله ای که قبلا توضیح دادم ) شما باید کلاس مورد نظر رو در لیست Namespase ها وارد کرده و خیلی معمولی از متد ها و کلاس های موجود در اون استفاده کنین موفق باشید.