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

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

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

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

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

مثال بالا را اجرا کرده و نتیجه را ببینید
نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد