امروز با تعدادی از ماتریس های 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
مثال بالا را اجرا کرده و نتیجه را ببینید