آموزش تخصصی ویژوال بیسیک 6

مسائل مربوط به برنامه نویسی ویژوال بیسیک 6

آموزش تخصصی ویژوال بیسیک 6

مسائل مربوط به برنامه نویسی ویژوال بیسیک 6

آموزش open gl قسمت ششم

خوب میریم سراغ آموزش قسمت ششم OpenGL :

در این قسمت یاد میگیرین که دیسک رسم کنین و در ادامه نیز چگونگی چسباندن عکس به اشکال سه بعدی رو یاد میگیرین.

۱- رسم استوانه:

۲- رسم دیسک:

۳- رسم دیسک مجهول(مثلا دیسک نیم دایره)



برای رسم استوانه و دیسک و دایره ما از کلاس Quadric استفاده میکنیم.به طور کلی هر شئی که دایره در آن به کار رفته باشد وابسته به کلاس Quadric است.

۱ - رسم استوانه:

برای رسم استوانه ما ابتدا یک متغیر از نوع Variant تعریف می کنیم . سپس متغیر را برابر کلاس Quadric قرار میدهیم بعد از آن هم با توابع کتابخانه glu اشکال مورد نظر خود را رسم میکنیم.کدهای زیر رو در DrawGLScene (مکان رسم اشکال) بنویسید:

Public Xrot , Yrot , Zrot as GLfloat

Public Function DrawGLScene() as Boolean

glClear clrColorBufferBit

glLoadIdentity

glRotatef xrot , 1 , 0 , 0

glRotatef yrot , 0 , 1 , 0

glRotatef zrot , 0 , 0 , 1



Dim Q

Q = gluNewQuadric

gluQuadricDrawStyle Q , qdsLine

glColor4f 1,1,1,1

gluCylinder Q , 0.3 , 0.3 , 0.8 , 15 , 15



Xrot = Xrot + 0.3

Yrot = Yrot + 0.2

Zrot = Zrot + 0.4



DrawGLScene = True

End Function

کدهایی که کمرنگ هستند تکراری هستند و فقط برای یادآوری بود که کدهای مربوط به رسم اشیا باید در این فانکشن نوشته شوند.

تحلیل کد برنامه: در خط اول ابتدا سه متغیر برای متحرک کردن شئ نوشتیم.در خط چهارم به کمک تابع glLoadIdentity شئ خود را ثابت و بدون حرکت کردیم تا حرکت را به عهده متغیر ها قرار دهیم. خط های ۸ و ۹ و ۱۰ و ۱۱ و ۱۲ را برای رسم استوانه نوشتیم. خط های ۱۳ و ۱۴ و ۱۵ هم برای متحرک کردن شئ است.

و اما شکل کلی تابع gluCylinder (تابع رسم استوانه): gluCylinder

خطوط عمودی , خطوط افقی , ارتفاع استوانه , شعاع دایره بالایی استوانه , شعاع دایره پایینی , متغیر

به همین سادگی شما یک استوانه رسم کردید.

--------------------------------------------------------------------------------

۲ - رسم دیسک : رسم دیسک نیز مانند رسم استوانه است با این تفاوت که به جای استفاده از تابع gluCylinder باید از تابع gluDisk استفاده کنیم. کدهای زیر رو در فانکشن DrawGLScene بنویسید:

Public Xrot , Yrot , Zrot as GLfloat

Public Function DrawGLScene () as Boolean

glClear clrColorBufferBit

glLoadIdentity

glRotatef xrot , 1 , 0 , 0

glRotatef yrot , 0 , 1 , 0

glRotatef zrot , 0 , 0 , 1



Dim Q

Q = gluNewQuadric

gluQuadricDrawStyle Q , qdsLine

glColor4f 1,0,0,1

gluDisk Q , 0.1 , 0.7 , 15 , 15



Xrot = Xrot + 0.3

Yrot = Yrot + 0.2

Zrot = Zrot + 0.4



DrawGLScene = True

End Function


--------------------------------------------------------------------------------

۳ - رسم دیسک مجهول(مثل دیسک نیم دایره):

برای رسم دیسک مجهول به جای استفاده از تابع gluDisk باید از تابع gluPartialDisk استفاده کرد. کدهای زیر رو هم امتحان کنین.

Public Xrot , Yrot , Zrot as GLFloat

Public Function DrawGLScene() as Boolean

glClear clrColorBufferBit

glLoadIdentity

glRotatef xrot , 1 , 0 , 0

glRotatef yrot , 0 , 1 , 0

glRotatef zrot , 0 , 0 , 1



Dim Q

Q = gluNewQuadric

gluQuadricDrawStyle Q , qdsLine

glColor4f 1,0,0,1

gluPartialDisk Q , 0.1 , 0.7 , 15 , 15 , 0 , 250



Xrot = Xrot + 0.3

Yrot = Yrot + 0.2

Zrot = Zrot + 0.4



DrawGLScene = True

End Function

شکل کلی تابع gluPartialDisk همانند تابع gluDisk است و فقط یک پارامتر بیشتر دارد(پارامتر آخر) و این پارامتر مشخص کننده مقدار مجهولی دیسک است.

به نظر من رسم دیسک های مجهول بسیار لذت بخش و جالبه

آموزش opengl قسمت هفتم

امروز با تعدادی از ماتریس های OpenGL آشنا میشیم و چگونگی استفاده کردن از آنها نیز آموزش داده میشود. ماتریس ها توابع کمکی OpenGL هستند و برای اعمال رسم اشکال و متحرک سازی آنها و ... به کار میروند. در زیر تعدادی از ماتریس ها آمده است که در ادامه به چگونگی کار کردن آنها میپردازیم.

۱- glBegin

2- glEnd

3- glClear

4- glLoadIdentity

5- glViewPort

6- glMatrixMode

7- gluPersPective

با ۴ تای اولی که آشنا هستید و من این ۴ تا رو فقط برای این گفتم که بدونید چهارتای اولی هم جزء ماتریس ها به حساب می آیند. و اما:



--------------------------------------------------------------------------------


۵- glViewPort :

شاید شما بخواهید اشکالی را که رسم کرده اید به سایز(اندازه)های مختلف در آورید مثلا هر گاه کاربر دکمه مثبت(+) کیبورد رو زد شکلی که ما رسم کرده ایم دو برابر شود. برای اینکارها از تابع glViewPort استفاده میشود. شکل کلی تابع glViewPort به صورت زیر است:

طول شئ , عرض شئ , مختصات Y , مختصات glViewPort X

مثال زیر را اجرا کنین و نتیجه را ببینید.

Public xrot , yrot , zrot as GLfloat

public VPW , VPH as GLint

public Function DrawGLScene() as Boolean

glClear clrColorBufferBit



glLoadIdentity

glRotatef xrot , 1 , 0 , 0

glRotatef yrot , 0 , 1 , 0

glRotatef zrot , 0 , 0 , 1



glViewPort 0 , 0 , VPW , VPH

Dim Q

Q = gluNewQuadric

gluQuadricDrawStyle Q , qdsLine

glColor4f 1,1,1,1

gluCylinder Q , 0.3 , 0.3 , 0.8 , 12 , 12



xrot = xrot + 0.3

yrot = yrot + 0.2

zrot = zrot + 0.4



VPH = VPH + 0.5

VPW = VPW + 0.5



DrawGLScene = True

End Function

بعد از اجرا کردن مثال بالا باید استوانه ای که در خط ۱۴ رسم شد کم کم بزرگ و بزرگ تر شود. اما مثال بالا یک اشکال دارد و اشکالش این است که آن قدر استوانه ما بزرگ میشود و بر آرگومان Width , Height تابع glViewPort اضافه میشود تا برنامه Error بدهد. کار مشکل زدایی با خودتان . ببینیم که شما چند برده حلاجین.



--------------------------------------------------------------------------------
۶ - glMatrixMode :

این ماتریس کارهایی انجام میدهید که بعد از امتحان کردن آنها میغهمید که چه کارهای جالب و حیرت انگیزی انجام میدهد.

تابع glMatrixMode یک آرگومان دارد . این آرگومان میتواند یکی از سه ثابت معرفی شده آن را بگیرد . ثابت های آرگومان تابع glMatrixMode عبارتند از:

۱- mmModelView : حالت پیش فرض ( معمولی)

2- mmProjection : حالت حرفه ای متصل به تابع glEnable

3- mmTexture : حالت ثابت ( شئ ما هیچ حرکتی نمی تواند بکند.)

مقدار اولی که هیچ تغییری ایجاد نمیکند. مقدار ۳ هم مانند تابع glLoadIdentity عمل میکند و کار متحرک سازی را خنثی میکند.(برای ساختن بازی می توانیم از سومی استفاده کنیم چرا که اگر کاربر روی یک دکمه مورد نظری کلیک کند کار به صورت موقتی متوقف میشود.) . اما ثابت دوم یعنی mmProjection:

ثابت mmProjection باعث میشود که اشکال ما به صورت حرفه ای تری رنگ آمیزی شوند یا کار متحرک سازی اشکال حرفه ای میشود.(مثلا اگر دایره ای به سمت راست در حال چرخش است هیچ گاه به سمت چپ حرکت نمی کند.) همچنین :

ثابت mmProjection به مقدار دهی تابع glEnable بستگی دارد.

مثال:

Public xrot , yrot , zrot as GLfloat

public Function DrawGLScene() as Boolean

glEnable glcDepthTest

glClear clrColorBufferBit



glLoadIdentity

glRotatef xrot , 1 , 0 , 0

glRotatef yrot , 0 , 1 , 0

glRotatef zrot , 0 , 0 , 1

glMatrixMode mmProjection

Dim Q

Q = gluNewQuadric

gluQuadricDrawStyle Q , qdsLine

glColor4f 1,1,1,1

gluCylinder Q , 0.3 , 0.3 , 0.8 , 12 , 12



xrot = xrot + 0.3

yrot = yrot + 0.2

zrot = zrot + 0.4



DrawGLScene = True

End Function

در مثال بالا وضعیت متحرک سازی را دستکاری کردیم سطح مختصات Z را همانند آب کردیم(مثلا هر گاه مختصات Z شی ما به ۰ و کمتر از صفر رسید ناپدید شود.) . اما اگر میخواهید وضعیت رنگ آمیزی و نورپردازی را مورد دستکاری قرار دهید باید مقدار آرگومان تابع glEnable را برابر glcFog قرار دهید به این صورت:

Public xrot , yrot , zrot as GLfloat

public Function DrawGLScene() as Boolean

glEnable glcFog

glClear clrColorBufferBit



glLoadIdentity

glRotatef xrot , 1 , 0 , 0

glRotatef yrot , 0 , 1 , 0

glRotatef zrot , 0 , 0 , 1

glMatrixMode mmProjection

Dim Q

Q = gluNewQuadric

gluQuadricDrawStyle Q , qdsLine

glColor4f 1,1,1,1

gluCylinder Q , 0.3 , 0.3 , 0.8 , 12 , 12



xrot = xrot + 0.3

yrot = yrot + 0.2

zrot = zrot + 0.4



DrawGLScene = True

End Function

مثال بالا را اجرا کرده و نتیجه را ببینید

آموزش opengl قسمت هشتم

امروز چگونگی بارگزاری (Load) کردن عکس رو براتون میزارم و به شما یاد میدم که چگونه از عکس در OpenGL استفاده کنین.

در جلسات قبل با چگونگی رسم اشکال سه بعدی آشنا شدید اما در این قسمت با چند تابع OpenGL جدید آشنا میشوید.

فرض کنید که می خواهید یک موشک را روی صفحه به حرکت در آورید.حال برای رسم یک موشک ما باید بالهای موشک / دم موشم و ... را دونه دونه رسم کنید و بر حسب صلیغه رنگ های مختلفی به موشک خود بدهید . با اندکی فکر کردن میفهمید که عجب کار دشوار و زمان گیری است . حال فکر کنید که میخواهید تصویر یک موشک را در صفحه حرکت دهید . این کار بسیار ساده و مفید است.

خوب بگذریم و بریم سر آموزش:

در مثال زیر چگونگی Load کردن یک عکس (Texture) را بلد میشوید و عکس لود شده را به صورت سه بعدی در صفحه به نمایش می گذارید.

توجه: حدود ۸۰ درصد کدهایی که در این مثال آمده است تکراری است.

یک پروژه جدید بسازید . بعد از منوی Project زیر منوی Refrences را بزنید تا پنجره انتخاب DLL ها به نمایش در آید. سپس بعد از پیدا کردن VB OpenGL API 1.2 تیک کنار آن را فعال کرده و OK کنید. دوباره از منوی Project زیر منوی Project Propertis را بزنید تا تنظیمات پروژه شما به نمایش در آید.در قسمت StartUP Project با تغیر دادن Form1 به Sub Main کامپایل کردن کدها را به ماژول متصل کنید.

بر روی فرم خود یک PictureBox با خصوصیت های زیر قرار دهید:

خاصیت
مقدار خاصیت

Name
Picture1

AutoRedraw
True

AutoSize
True

HasDC
True

ScaleMode
3-Pixels

Width
6105

Height
5745

Visable
False




ابتدا تمامی توابع و روال هایی که در جلسات گذشته گفته بودم رو بنویسید که عبارتند از:

Sub Main , InitGL , CreateGLWindow , DrawGLScene , KillGLWindow , ...

حالا یک ماژول جدید دیگه باز کنین . برای این کار از منوی Project زیرمنوی Add Module را بزنید و خاصیت نام(Name) ماژول خود را برابر LoadTex قرار دهید.(این نام اختیاری است هر نامی که دلت میخواد می تونی بزاری.)

ابتدا در ماژول جدید خود باید چند تا متغیر عمومی تعریف کنید برای این کار کدهای زیر را به ماژول LoadTex اضافه کنید:

Public Hrc as long

public FullScreen as Boolean

Public Texture(0) as glInt

public Xrot as glFloat

Public Yrot as GLFloat

Public Zrot as GLFloat

خوب تا اینجا کار تعریف کردن متغیرها به پایان میرسد در ادامه باید فانکشن های بارگذاری تصویر را بنویسید.

بعد از تعریف کردن متغیر ها ما باید روال LoadBMP را بنویسیم که کار آن تعیین عکسی است که می خواهد به نمایش درآید.برای این کار کدهای زیر را به ماجول خود اضافه کنید:

Public Function LoadBMP(ByVal FileName as String , ByRef Texture() as GLInt , ByRef Height as Long , ByRef Width as Long) as Boolean

Form1.Picture1.Picture = LoadPicture(FileName) 'x

CreateMapImage Form1.Picture1 , Texture() , Height , Width

LoadBMP = True

End Function

مطمئنآ در قطعه کد بالا با تابع CreateMapImage آشنایی ندارید که در ادامه این ساب روتین را تعریف میکنیم. کار این ساب روتین ست کردن رنگ تصویر و نمایش دادن آن است. کد زیر را به ماژول خود اضافه کنید:

Public Sub CreateMapImage(Pict as PictureBox , ByRef TextureIMG() as GLByte , ByRef Height as long , ByRef Width as Long ) 'x

Pict.ScaleMode = 3

Height = Pict.ScaleHeight

Width = Pict.ScaleWidth

ReDim TextureIMG(2 , Height - 1 , Width - 1) 'x

Dim X , Y , C as Long

Dim Yloc as Long

For X = 0 to Width - 1

For Y = 0 To Height - 1

C = Pict.Point(X , Y) 'x

Yloc = Height - Y - 1

TextureIMG(0 , X , Yloc) = C And &HFF

TextureIMG(1 , X , Yloc) = (C 256) And &HFF

TextureIMG(2 , X , Yloc) = (C 65536) And &HFF

Next Y

Next X

End Sub



حالا باید تابع مربوط به بارگذاری و اجرای الگو ( که در اینجا یک عکس است) را بنویسیم. کار این کدها بارگذاری یک فایل تصویری(Bitmap) است. اگر تصویر در مسیر تعیین شده وجود نداشته باشد توسط یک شرط از برنامه خارج میشود.توجه داشته باشید که عکسی را که میخواهید به صورت ۳ بعدی به نمایش بگذارید باید توانی از ۲ باشد(مثلا ۲ به توان ۵ یا ۲ به توان ۷ و ...)که ما در اینجا یک فایل تصویری ۲۵۶ در ۲۵۶ پیکسل را به نمایش می گذاریم . توجه اگر عکسی که اندازه آن ۲۵۶ در ۲۵۶ است ندارید میتوانی با برنامه فوتوشاپ این کار را انجام دهید اگر میخواهید خوب یادبگیرین مطالب این وبلاگو بخونین:

آموزش مقدماتی تا حرفه ای فوتوشاپ

خوب حالا باید تابع LoadGLTextures رو بنویسیم که برای این کار کدهای زیر را به ماژول خود اضافه کنید:

Public Function LoadGLTextures() as Boolean

Dim Status as Boolean

Dim H , W as Long

Dim TextureImage() as GLByte

Status = False

If LoadBMP("D:07.bmp" , TextureImage() , H , W) Then

Status = True

GLGenTextures 1 , Texture(0) 'X

GLBindTexture glTexture2D , Texture(0) 'X

glTexImage2D glTexture2D , 0 , 3 , W , H , 0 , GL_RGB , GL_UNSIGNED_BYTE , TextureImag(0 , 0 , 0 )

glTexParameteri glTexture2D , tpnTextureMinFilter , GL_LINEAR

glTexParameteri glTexture2D , tpnTextureMagFilter , GL_LINEAR

End IF

Erase TextureImage

LoadGLTexture = Status

End Function

بعد از نوشتن این کدها حالا باید یک چند خطی کد هم به تابع InitGL اضافه کنیم.در ادامه تابع InitGL را به صورت زیر تغیر دهید:

Public Function InitGL() as Boolean

If Not LoadGLTexture Then

InitGL = False

Exit Function

End If

glEnable glcTexture2D

glShadeModel smSmooth

glClearColor 0,0,0,0

glClearDepth 1

glEnable glcDepthTest

glDepthFunc cfLEqual

glHint htPersPectiveCorrectionHint , hmNicest

InitGL = True

End Function

تا اینجا شما کار بارگذاری و اجرای تصویر را انجام دادید اما با اجرا کردن این پروژه چیزی در صفحه نمایش داده نمیشود چرا که تابع DrawGLScene هنوز دست نخورده است و باید کدهای مربوط به نمایش تصویر را بنویسیم. پس تابع DrawGLScene را به این صورت تغییر دهید:

Public Function DrawGLScene() As Boolean
glPolygonMode faceFrontAndBack, pgmFILL
' Here's Where We Do All The Drawing
glClear clrColorBufferBit Or clrDepthBufferBit ' Clear Screen And Depth Buffer
glLoadIdentity ' Reset The Current Matrix
glTranslatef 0#, 0#, 0# ' Move Into The Screen 5 Units
glRotatef xrot, 1#, 0#, 0# ' Rotate On The X Axis
glRotatef yrot, 0#, 1#, 0# ' Rotate On The Y Axis
glRotatef zrot, 0#, 0#, 1# ' Rotate On The Z Axis

glBindTexture GL_TEXTURE_2D, Texture(0) ' Select Our Texture

glBegin GL_QUADS
' Front Face
glNormal3f 0, 0, 0.5
glTexCoord2f 0#, 0#: glVertex3f -0.5, -0.5, 0.5 ' Bottom Left Of The Texture and Quad
glTexCoord2f 0.5, 0: glVertex3f 0.5, -0.5, 0.5 ' Bottom Right Of The Texture and Quad
glTexCoord2f 0.5, 0.5: glVertex3f 0.5, 0.5, 0.5 ' Top Right Of The Texture and Quad
glTexCoord2f 0, 0.5: glVertex3f -0.5, 0.5, 0.5 ' Top Left Of The Texture and Quad
' Back Face
glNormal3f 0, 0, -0.5
glTexCoord2f 0.5, 0#: glVertex3f -0.5, -0.5, -0.5 ' Bottom Right Of The Texture and Quad
glTexCoord2f 0.5, 0.5: glVertex3f -0.5, 0.5, -0.5 ' Top Right Of The Texture and Quad
glTexCoord2f 0#, 0.5: glVertex3f 0.5, 0.5, -0.5 ' Top Left Of The Texture and Quad
glTexCoord2f 0#, 0#: glVertex3f 0.5, -0.5, -0.5 ' Bottom Left Of The Texture and Quad
' Top Face
glNormal3f 0, 0.5, 0
glTexCoord2f 0#, 0.5: glVertex3f -0.5, 0.5, -0.5 ' Top Left Of The Texture and Quad
glTexCoord2f 0#, 0#: glVertex3f -0.5, 0.5, 0.5 ' Bottom Left Of The Texture and Quad
glTexCoord2f 0.5, 0#: glVertex3f 0.5, 0.5, 0.5 ' Bottom Right Of The Texture and Quad
glTexCoord2f 0.5, 0.5: glVertex3f 0.5, 0.5, -0.5 ' Top Right Of The Texture and Quad
' Bottom Face
glNormal3f 0, -0.5, 0
glTexCoord2f 0.5, 0.5: glVertex3f -0.5, -0.5, -0.5 ' Top Right Of The Texture and Quad
glTexCoord2f 0#, 0.5: glVertex3f 0.5, -0.5, -0.5 ' Top Left Of The Texture and Quad
glTexCoord2f 0#, 0#: glVertex3f 0.5, -0.5, 0.5 ' Bottom Left Of The Texture and Quad
glTexCoord2f 0.5, 0#: glVertex3f -0.5, -0.5, 0.5 ' Bottom Right Of The Texture and Quad
' Right face
glNormal3f 0.5, 0, 0
glTexCoord2f 0.5, 0#: glVertex3f 0.5, -0.5, -0.5 ' Bottom Right Of The Texture and Quad
glTexCoord2f 0.5, 0.5: glVertex3f 0.5, 0.5, -0.5 ' Top Right Of The Texture and Quad
glTexCoord2f 0#, 0.5: glVertex3f 0.5, 0.5, 0.5 ' Top Left Of The Texture and Quad
glTexCoord2f 0#, 0#: glVertex3f 0.5, -0.5, 0.5 ' Bottom Left Of The Texture and Quad
' Left Face
glNormal3f -0.5, 0, 0
glTexCoord2f 0#, 0#: glVertex3f -0.5, -0.5, -0.5 ' Bottom Left Of The Texture and Quad
glTexCoord2f 0.5, 0#: glVertex3f -0.5, -0.5, 0.5 ' Bottom Right Of The Texture and Quad
glTexCoord2f 0.5, 0.5: glVertex3f -0.5, 0.5, 0.5 ' Top Right Of The Texture and Quad
glTexCoord2f 0#, 0.5: glVertex3f -0.5, 0.5, -0.5 ' Top Left Of The Texture and Quad
glEnd

xrot = xrot + 0.3 ' X Axis Rotation
yrot = yrot + 0.2 ' Y Axis Rotation
zrot = zrot + 0.4 ' Z Axis Rotation
DrawGLScene = True ' Keep Going

End Function


برای اینکه برای شما مشکلی پیش نیاید پیشنهاد میکنم کدهای بالا رو کپی و پست (Copy Past ) کنین.

حالا نوبت به اجرای برنامه میرسه . قبل از اجرای برنامه در تابع LoadGLTextures در خط ششم شما باید به جای "D:07.bmp" مسیر فایل تصویری که اندازه آن ۲۵۶ در ۲۵۶ پیکسل است را بدهید اگر اندازه(Size) عکس شما مغایر با بالا باشد تصویری که ایجاد میشود مبهم است و رنگ های آن به هم میریزد.

خوب دیگه حالا با خیال راحت برنامه تون رو اجرا کنین.