بعد از اینکه فایل مورد نظر رو دانلود کردین ویژوال بیسیک رو باز
کنین و از منوی Project گزینه
Refrences رو بزننین و در پنجره باز شده دکمه فرمان Browse رو بزنین و آدرس فایل vbogl.tlb (همون
فایلی که دانلود کردین) رو باز کنین و بعد از انتخاب کردن فایل vbogl.tlb روی دکمه
فرمان Open کلیک کنید.
بعد در داخل کادری که لیست DLL های شناسایی شده است به دنبال VB OpenGL API 1.2 بگردین و
تیک کنار اون رو فعال کنین.
برای اینکه کدهایی که ما مینویسیم با استفاده از روتین های OpenGL هست در
داخل فرم ما نمایش داده نمیشه و ما برای اینکه کدهایی که مینویسیم اجرا بشه باید
تغیراتی در برنامه ایجاد کنیم برای اینکار:در ویژوال بیسیک از منوی Project روی Project Properties کلیک
کنید تا جعبه تنظیم خواص پروژه باز بشه.بعد از لیست باز شو Startup Object گزینه Sub Main را انتخاب کنید و OK را بزنید.
حالا میریم سراغ کد نویسی:
از منوی
Project گزینه Add
Module را بزنید تا برای شما یک ماژول جدید بسازد.بعد خاصیت Name ماجول رو
برابر با OpenGLMain
قرار دهید.
حالا ما کدهای اصلی که موتور گرافیکی ۳ بعدی ما رو میسازه مینویسیم.
روی ماجول جدید خود دابل کلیک کنید تا پنجره View Code باز بشه.و بعد کدهای زیر رو بنویسید:
Sub Main()
Dim Done As Boolean
Dim frm As Form
Done = False
Set frm = New Form1
If Not CreateGLWindow(frm, 640, 480, 16) Then Done = True
Do While Done =
False
If (DrawGLScene = False) Then
Unload frm
Else
SwapBuffers (frm.hDC)
DoEvents
End If
Done = frm.Visible = False
Loop
Set frm = Nothing
End
End Sub
در قطعه کد بالا ابتدا یک
متغیر از نوع بولین تعریف میکنیم . تا وقتی
که متغیر Done مقدار
False داشته باشد برنامه ما ادامه پیدا میکند ولی هر گاه که متغیر Done برابر با True شود
برنامه خاتمه پیدا میکند. در خط بعدی ما یک متغیر به نام frm از نوع Form تعریف میکنیم و در خط پنجم نیز
متغیر frm را به فرم برنامه مرتبط میکنیم.در خط ششم نیز از یک دستور شرطی
استفاده کردیم که هرگاه CreateGLWindow (که در ادامه آن را میسازیم و کار
آن ساخت پنجره ای است که اشیا دو بعدی و چند بعدی ما در آن نمایش داده شوند) برابر
با مقداری خلاف قوانین ما شد برنامه خاتمه پیدا کند و باعث هنگ کردن سیستم نشود.
در ادامه ما باید پنجره نمایش اشیا را که نام آن CreateGLWindow است بسایم. برای این کار کدهای
زیر را در ماجول بنویسید:
Public Function CreateGLWindow(frm As Form, Width As Integer,
Height As Integer, Bits As Integer) As Boolean
Dim PixelFormat As GLuint
Dim PFD As PIXELFORMATDESCRIPTOR
PFD.cColorBits = Bits
PFD.cDepthBits = 16
PFD.dwFlags = PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or
PFD_DOUBLEBUFFER
PFD.iLayerType = PFD_MAIN_PLANE
PFD.iPixelType = PFD_TYPE_RGBA
PFD.nSize =
Len(PFD) 'X
PFD.nVersion = 1
PixelFormat = ChoosePixelFormat(frm.hDC,
PFD) 'X
If PixelFormat = 0 Then
KillGLWindow
MsgBox "Can't set the:", 16
CreateGLWindow = False
End If
If SetPixelFormat(frm.hDC, PixelFormat, PFD) = 0 Then
KillGLWindow
MsgBox
"" 'X
CreateGLWindow = False
End If
hrc = wglCreateContext(frm.hDC(
If hrc = 0 Then
KillGLWindow
MsgBox "Can't rendering Context:", vbExclamation,
"ERROR
CreateGLWindow = False
End If
If wglMakeCurrent(frm.hDC, hrc) = 0 Then
KillGLWindow
MsgBox "Can't Active rendering Context:", vbExclamation,
"ERROR
CreateGLWindow = False
End If
frm.Show
If Not InitGL() Then
KillGLWindow
MsgBox
"Initialize Failed!",vbExclamation,"Error
CreateGLWindow = False
End If
CreateGLWindow = True
End Function
در داخل روتین بالا دو
تابع دیگر به نام های
KillGLWindow و InitGL فراخوانی شده اند که ما باید اونها رو در داخل ماجولمون بنویسیم.
کار تابع CreateGLWindow در اصل
ساخت Engin (موتور) گرافیکی است و توابع دیگر مانند KillGL و InitGL کارهایی از قبیل خطا زدایی انجام
میدهند بنابر این تابع CreateGLWindow مهمترین تابع برنامه ماست چون که
موتور گرافیکی ما رو میسازه.
برای نوشتی تابع KillGLWindow کدهای
زیر رو به ماجولتون اضافه کنین:
Public Sub KillGLWindow()
If hrc Then
If wglMakeCurrent(0, 0) = 0 Then
MsgBox "Rilase DC and RC Failed.", vbInformation,
"ShutDownError"
End If
If wglDeleteContext(hrc) = 0 Then
MsgBox "Failed", vbInformation, "ERROR" '
End If
hrc = 0
End If
End Sub
حالا باید تابع InitGL رو
بنویسیم که کار این تابع پاک کردن صفحه نمایش و آماده سازی آن برای رسم اشکال سه
بعدی است.
برای نوشتن تابع InitGL کدهای
زیر رو به ماجول برنامتون اضافه کنین:
Public Function InitGL() As Boolean
glClearColor 0.5, 0.5, 1, 0
InitGL = True
End Function.
برای ادامه کار شما باید
یک ماجول دیگه با نام
DrawShape بسازین . برای این کار از منوی Project روی منوی Add Module کلیک کنید و خاصیت Name ماجول
جدید خود را برابر با
DrawShape کنید.
حالا باید تابعی رو
بنویسیم که کار رسم اشکال دو بعدی و سه بعدی رو برعهده داره.اسم این تابع DrawGLScene است که
برای نوشتن آن کدهای زیر را به ماجول DrawShape اضافه کنین:
Publice Function DrawGLScene() as Boolean
glClear clrcolorbufferbit
DrawGLScene = True
End Function
حالا برنامه ای رو که
ساختین اجرا کنین اگه کارها رو درست انجام داده باشین باید رنگ پشت زمینه فرم شما
آبی رنگ بشه .
قسمت 2
ما در این جلسه تمام سروکارمون با ماجول
DrawShape است و در داخل تابع
DrawGLScene باید کدهای مربوط به رسم
اشکال را بنویسیم.
برای رسم اشکال ما باید از تابع
glBegin استفاده کنیم. تابع
glBegin به OpenGL میگوید که ما آماده رسم اشکال هستیم. برای رسم
اشکال بعد از فراخوانی تابع glBegin با کمک تابع glVertex و glColor ما مختصات راس های شکل مورد نظر و رنگ مورد نظر که
به شکل پاشیده میشود را رسم میکنیم. در پایان نیز با تابع glEnd به OpenGL میگوییم که کار رسم کردن شکل ها به پایان رسیده
است.
تابع glBegin پارامتری به نام Mode دارد که به کمک پارامتر Mode ما میتوانیم اشکال هندسی مختلفی رسم کنیم . مثل :
مربع و مستطیل و مثلث و چندضلعی های دیگر.
پارامتر Mode مقادیریرا میتواند بگیرد که تعدادی از آنها در زیر
آمده است:
مقادیر
توضیحات
bmPoints
رسم نقاط جدا از هم
bmLines
رسم خط که دو راس دارد
bmLineStrip
رسم خط های به هم پیوسته
bmLineLoop
رسم خط های به هم پیوسته
bmTriangles
رسم مثلث با دادن سه راس
bmTriangleStrip
رسم مثلث های به هم پیوسته
bmTriangleFan
رسم مثلث های به هم پیوسته با یک
راس مشترک
bmQuads
رسم چهار ضلعی هایی که دارای یک راس
مشترک هستند
bmQuadStrip
رسم چهار ضلعی های به هم پیوسته
bmPolygon
رسم چند ضلعی که ضلع های آن به
تعداد دلخواه است
رسم دایره
در جلسات بعد توضیح خواهم داد
این مقادیری که در جدول نوشتم توضیح خواهم داد
۱- bmPoints رسم نقطه:
برای اینکه ما بتونیم یک نقطه روی فرممون رسم کنیم
باید مقدار Mode رو به bmPoints ست کنیم.
برای رسم یک نقطه در ماجول DrawShape و در تابع DrawGLScene کدهای زیر رو بنویسید:
Publice Function
DrawGLScene() as Boolean
glClear
clrColorBufferBit
glBegin bmPoints
glVertex2f 0,0
glEnd
DrawGLScene = True
End Function
در مثال بالا کدهایی که کمرنگ تر هستند رو برای یادآوری
نوشتم. شما دیگه لازم نیست که یک تابع جدید DrawGLScene تعریف کنید چون این کار باعث ایجاد مشکل در برنامه
میشه.
در مثال بالا در خط سوم به کمک تابع
glBegin به OpenGL فرمان دادیم که برایمانPoint(نقطه) رسم کند. در خط چهارم
نیز به کمک تابع glVertex2f (که یکی از توابع بسیار مهم OpenGL هست) مختصات نقطه ای که باید رسم شود را نوشتیم.در
خط پنجم نیز به رسم نقطه پایان دادیم.
با اجرا کردن برنامه باید در وسط فرم شما یک نقطه
رسم شده باشد.
شما میتوانید هرچه قدر که نقطه دوست دارین رسم
کنین با تابع glBegin bmPoints / glEnd رسم کنین.
شاید شما بخواین که نقطه ای رو که رسم میکنین
بزرگتر بشه و نقاطی رو رسم کنین که جای بیشتری میگیرن برای این کار از تابع
glPointSize استفاده کنین.
برای مثال شما در نمونه برنامه ای که در بالا آمده
شد این تابع رو اضافه کنین و مقدار اون رو به 50 ست کنین به این صورت:
glPointSize 50
با این کار نقطه شما ۵۰ برابر بزرگتر میشه.
توجه : تابع glPointSize را حتما باید قبل از تابع glBegin bmPoints تعریف کنین.
گاهی وقت ها برای شما پیش میاد که چرا وقتی
نقطه ای رو بزرگ میکنیم دقت گرافیکی اون نقطه کم میشه و به شکل مربع در میاد برای
برطرف کردن این مشکل و به عبارتی دندانه زدایی تابعی وجود دارد که از پر
کاربردترین توابع openGL است.
تابع glEnable :
تابع glEnable مقادیری را میگیرد که در زیر فقط به مقدار
glcPointSmooth اشاره میکنیم.
مقدار glcPointSmooth برای افزایش دقت گرافیکی اشیا و همچنین دندانه
زدایی آنهاست. برای اینکه بهتر با این تابع و مقدار تابع آشنا بشین بعد از تعریف
کردن تابع glPointSize در خط بعد از آن تابع glEnable را تعریف کنید. به این صورت:
glEnable glcPointSmooth
۲- bmLines رسم خط :
برای رسم خطوط در OpenGL از تابع glBegin و با ثابت bmLines استفاده میکنیم. در این تابع به جای اینکه یکبار
تابع glVertex2f را فراخوانی کنیم باید دو تا تابع
glVertex2f فراخوانی کنیم چراکه برای
رسم خط به دو مختصات ( مختصات نقطه اول پاره خط و مختصات پایان رسم پاره خط)
احتیاج داریم.
glBegin bmLines
glVertex2f -0.5 ,
0
glVertex2f 0.5 , 0
glEnd
در مثال بالا با دادن دو مختصات خطی برای ما رسم
میشود.
برای دندانه زدایی خطوط قبل از فراخوانی تابع
glBegin تابع
glEnable با مقدار
glcLineSmooth بنویسید. به صورت
زیر:
glEnable glcLineSmooth
تمرین جلسه دوم :
۱- نقطه ای رسم کنید که انداره اون ۲۵ برابر نقطه معمولی باشه و دندانه نداشته باشد.
0- با رسم ۳ خط یک مثلث بسازین.
قسمت 3--------------------------------------------------------------------
۳- bmTriangles رسم مثلث:
برای رسم مثلث های گوناگون ( متساوی ها و قائم
الزاویه ها و ...) از تابع glBegin با دادن ثابت bmTriangles میتوانیم بعد از فراخوانی سه تابع
glVertex2f (که رئوس اضلاع مثلث را
شامل میشوند) مثلث مورد نظر را رسم کنیم.
در مثال زیر یک مثلث با رنگ آبی در وسط فرم نمایش
داده میشود.
glBegin
bmTriangles
glcolor3f 0, 0, 1
glvertex2f 0.5 , 0
glvertex2f 0 , 0.5
glvertex2f -0.5 ,
0
glEnd
شاید با تابع glColor3f آشنا نباشید. تابع glColor3f باعث میشود که رنگ مورد نظر برای اشیا را مشخص
کنیم. تابع glColor#f که # در آن از ۳ تا ۴ میباشد رنگ مورد نظر را تایین میکند. در ادامه درباره این تابع
بیشتر صحبت میکنم.
۴- bmQuads رسم چهار ضلعی ها (از جمله لوزی / مربع / مستطیل /
ذوزنقه و سایر چهار ضلعی ها:
برای رسم چهار ضلعی ها مانند رسم سایر اشیا از
تابع glBegin استفاده میکنیم و مقدار Mode تابع glBegin را برابر bmQuads می کنیم. در مثال زیر یک مستطیل در نیمه ی بالایی
فرم رسم میکنیم:
glBegin bmQuads
glcolor4f 0,1,0 ,0
glVertex2f 0.5 , 0
glvertex2f 0.5 ,
0.5
glvertex2f -0.5 ,
0.5
glvertex2f -0.5 ,
0
glEnd
همان طور که در مثال بالا می بینید ما برای رسم مستطیل
از چهار تابع glVertex2f استفاده کرده ایم. دلیل استفاده از تابع
glVertex تایین رئوس اضلاع مستطیل
است.
۵- bmPolygon رسم چند ضلعی:
برای رسم چند ضلعی باید بعد از فراخوانی تابع
glBegin از ثابت
bmPolygon استفاده کنیم . برای رسم
چند ضلعی ها ما میتوانیم در داخل بلوک glBegin/glEnd به تعداد دلخواه تابع glVertex فراخوانی کنیم چرا که تعداد اضلاع به تعداد توابع
glVertex بستگی دارد.
در مثال زیر یک ۶ ضلعی بارنگ قرمز رسم میکنیم.
glBegin
bmPolygon
glColor3f 1, 0, 0
glVertex2f 0.5, 0
glVertex2f 0.3, 0.5
glVertex2f -0.3, 0.5
glVertex2f -0.5, 0
glVertex2f -0.3, -0.5
glVertex2f 0.3, 0.5
glEnd
و اما رسم دایره:
شما میتونین برای رسم دایره به کمک تابع
glBegin و ثابت
bmPolygon دایره رسم کنین ولی تعداد
خطوطی که باید کد بنویسین خیلی زیاد میشه.
Open GL برای رسم دایره از یک کتابخانه کمکی به نام glu
استفاده میکند .
در ادامه چگونگی رسم دایره.
برای رسم دایره دیگر نمیتوانیم از تابع
glBegin استفاده کنیم زیرا تابع
glBegin ثابتی ندارد که بتواند
دایره رسم کند. پس:
برای رسم دایره شما ابتدا باید یک متغیر از نوع
Variant تعریف کنید:
Dim Q as Variant
بعد از تعریف کردن متغیر باید اون رو برای رسم
دایره آماده کنین به این صورت:
Q = gluNewQuadric
بعد باید رنگ مورد نظر خودتون رو به دایره بدین:
glColor3f 0,0,1
بعد از اون هم باید چگونگی نمایش دایره رو مشخص
کنیم( این موضوع برای استفاده سه بعدی کاربرد دارد و من در جلسه بعد به توضیح این
تابع میپردازم اما بد نیست که بهتر با تابع آشنا بشین.)
gluQuadricDrawStyle Q , qdsLine
در ادامه نیز به رسم دایره میپردازیم:
gluSphere Q , 0.5 , 20 , 20
بعد هم برنامه را اجرا میکنیم و نتیجه را می بینیم.
مثال بالا در کل به این صورت است:
Dim Q
Q = gluNewQuadric
glcolor3f 0 , 0 , 1
gluQuadricDrawStyle
Q , qdsLine
gluSphere Q , 0.5
, 20 , 20
تمرین
۱- چهار ضلعی رسم کنین که رنگ آن قرمز باشد. سپس در وسط آن چهار ضلعی یک
مثلث به رنگ آبی رسم کنین.
۲- دایره ای رسم کنین که رنگ آن سبز باشد .
قسمت 4--------------------------------------------------------------
در جلسه چهارم آموزش OpenGL یاد میگیرین که :
۱- اشیای
خود را با چند رنگ مختلف رسم کنین. (برای مثال گوشه بالا سمت راست آبی و نیمه
پایینی مربع قرمز باشد و وسط مربع نیز ترکیبی از این دو رنگ.)
۲- اشیای سه بعدی رسم کنین.
3-چگونگی متحرک سازی اشیای سه
بعدی.
۱- رنگ آمیزی اشیا:
یکی از قابلیت های مهم OpenGL ترکیب رنگ های مختلف در یک شئ
است. که در این کار هر راس از شئ رنگ متفاوتی میگیرد. برای این کار تابعی وجود
دارد که نام آن glShadeModel است . این تابع به OpenGLمیگوید که اشیای ما فقط یک رنگ بگیرند یا با چند رنگ مختلف رنگ
آمیزی شوند. این تابع دو ثابت دارد:
۱: smFlat فقط یک
رنگ میتوانیم به شئ اختصاص دهیم.
۲: smSmooth می
توانیم ترکیبی از رنگها را به شی اختصاص دهیم.
در حالت پیش فرض مقدار تابع glShadeModel برابر smFlat است که ما در این صورت فقط یک رنگ
میتوانیم به شئ مان اختصاص دهیم.
باید همیشه این نکته را توجه داشته باشید که تابع glShadeModel قبل از بلوک glBegin / glEnd بیاید که در غیر این صورت خطا رخ
میدهد.
در مثال زیر یک مثلث با رنگ های قرمز و سبز و آبی رسم میکنیم:
glShadeModel smSmooth
glBegin bmTriangles
glcolor3f 1,0,0
glVertex2f 0.5, 0
glColor3f 0 , 1 , 0
glVertex2f 0 , 0.5
glcolor3f 0 , 0 , 1
glVertex2f -0.5 , 0
glEnd
حالا برنامتون رو اجرا کنین و نتیجه رو مشاهده کنین.
حالا برای تمرین مقدار تابع glShadeModel را برابر smFlat قرار دهید و نتیجه رو نگاه کنین.
۲- رسم اشیای سه بعدی:
برای رسم اشیای سه بعدی
همانند رسم اشیای ۲ بعدی عمل میکنیم . یعنی اینکه با فراخوانی بلوکglBegin .../.../glEnd میتوانیم اشیای سه بعدی
رسم کنیم. رسم اشیای سه بعدی بسیار بسیار ساده و آسان است و برای برنامه نویسان OpenGL لذت بخش ترین بخش برنامه
نویسی است. ما برای رسم اشیای سه بعدی به جای استفاده از تابع glVertex2f از توابع glVertex3f و یا glVertex4f استفاده می کنیم . مطمئنم
که فهمیدید . بله در تابع glVertex2f همان طور که از شماره ۲ آن معلوم است توانایی رسم
اشیای ۲ بعدی را دارد اما توابع glVertex3f , glVertex4f بر اساس شماره آنها
توانایی رسم اشیای سه بعدی را دارند.
شکل کلی تابع glVertex3f به صورت زیر است:
glVertex3f X , Y ,
Z
که در این تابع x و y همان مختصات معمولی رئوس
شئ هستند ولی z عمق شی را نشان می دهد.
مختصات اشیای سه بعدی:
کسانی که برنامه نویس
هستند قطعا مختصات سه بعدی رو هم بلدند اما مختصات سه بعدی مختصاتی فرضی است و فقط
با مغز انسان قابل درک است. در مثال بعد یک مثلث سه بعدی رسم میکنم:
مثال: رسم مثلث ۳ بعدی:
glShadeModel
smSmooth
glBegin
bmTriangles
glColor3f 1,0,0
glVertex3f 0.5 ,
0, 0
glColor3f 0,1,0
glVertex3f 0 , 0.3
, 0
glColor3f 0,0,1
glVertex3f -0.5 ,
0 , 0
glEnd
مثال بالا را اجرا کنین و
نتیجه کدهایی که نوشتین رو نگاه کنین.
ممکنه بعد از اجرای
برنامه با خودتون بگین که ما یک مثلث سه بعدی رسم کردیم ولی چرا از یک بعد قابل
روئیت بود ! برای اینکه از تمامی ابعاد و از همه طرف مثلث رو ببینین باید اون رو
متحرک کنین.(یعنی حرکت بدین.)
۳- متحرک کردن اشیای سه
بعدی:
برای متحرک کردن اشیای سه
بعدی OpenGl تابعی دارد که نام آن glRotatef است . تابع glRotateF دارای ۴پارامتر است و شکل کلی آن به این صورت است:
مختصات Z , مختصات Y , مختصات X , سرعت
حرکت glRotatef
در این تابع هر چه مقدار
سرعت حرکت بیشتر باشد شئ مورد نظر ما با سرعت بیشتری حرکت میکند .
در مثال زیر یک مثلث سه
بعدی با سه رنگ متفاوت را به حرکت در می آوریم:
glRotatef 2 , 0.5
, 0.5 , 0.5
glShadeModel
smSmooth
glBegin
bmTriangles
glColor3f 1,0,0
glVertex3f 0.5,0,0
glColor3f 0,1,0
glVertex3f 0,0.3,0
glColor3f 0,0,1
glColor3f -0.5,0,0
glEnd
مثال بالا رو هم حتما
اجرا کنین و نتیجه رو ببینین.
همون طور که در مثال بالا
مشاهده می کنین تابع glRotatef نیز باید در قبل و خارج از بلوک glBegin/glEndباشد
قسمت 5
------------------------------------------------------------
در این جلسه یاد میگیرین
که:
۱- رسم مکعب:
۲- رسم کره:
۳- رسم منشور و اهرام( مکعب
مثلث):
۴- رسم استوانه ( یا دیسک):
در این جلسه چگونگی رسم
مکعب و کره و اهرام را میدم و رسم استوانه را برای جلسه بعد . چرا که رسم
استوانه و دیسک کاملا با بقیه مکعب ها فرق داره و مستلزم اختصاص دادن وقت بیشتری
برای آموزش آن داره پس برای رسم مکعب خودتون رو آماده کنین.
۱- رسم مکعب (مکعب مربع و
مستطیل):
رسم مکعب های سه
بعدی بسیار ساده است و ما با استفاده از بلوک glBegin/glEnd مکعب های سه بعدی خودمان
را رسم می کنیم. برای اینکه چگونگی رسم مکعب های سه بعدی رو یاد بگیرین خطوط زیر
را با دقت بخونین:
می دونید که مربع دارای
چهار راس است . همچنین از چهار پاره خط تشکیل شده است. یک مکعب مربع یا مستطیل
از شش تا چهار ضلعی تشکیل شده است . همچنین این شش تا چهار
ضلعی دارای ۱۲ پاره خط است . برای درک بهتر شما یک مثال میزنم تا بهتر بفهمین.
در مثال زیر با استفاده
از رسم شش تا مربع یک مکعب مستطیل میسازیم:
glShadeModel smSmooth
glRotatef
1,0.5,0.3,0.2
glBegin bmQuads
glColor3f 0#, 1#, 0#
glVertex3f 0.5, 0.5, -0.5
glVertex3f -0.5, 0.5, -0.5
glVertex3f -0.5, 0.5, 0.5
glVertex3f 0.5, 0.5, 0.5
glColor3f 1#, 0.5, 0#
glVertex3f 0.5, -0.5, 0.5
glVertex3f -0.5, -0.5, 0.5
glVertex3f -0.5, -0.5, -0.5
glVertex3f 0.5, -0.5, -0.5
glColor3f 1#, 0#, 0#
glVertex3f 0.5, 0.5,
0.5
glVertex3f -0.5, 0.5, 0.5
glVertex3f -0.5, -0.5,
0.5
glVertex3f 0.5, -0.5, 0.5
glColor3f 1#, 1#,
0#
glVertex3f 0.5, -0.5, -0.5
glVertex3f -0.5, -0.5,
-0.5
glVertex3f -0.5, 0.5, -0.5
glVertex3f 0.5, 0.5,
-0.5
glColor3f 0#, 0#, 1#
glVertex3f -0.5, 0.5,
0.5
glVertex3f -0.5, 0.5, -0.5
glVertex3f -0.5, -0.5,
-0.5
glVertex3f -0.5, -0.5, 0.5
glColor3f 1#, 0#,
1#
glVertex3f 0.5, 0.5, -0.5
glVertex3f 0.5, 0.5,
0.5
glVertex3f 0.5, -0.5, 0.5
glVertex3f 0.5, -0.5,
-0.5
glEnd
مثال بالا رو اجرا کنین و
نتیجه رو نگاه کنین.
۲- رسم کره:
رسم کره نیز همانند رسم
دایره است و هیچ فرقی ندارد . دایره ای را که در جلسات پیش رسم کردیم سه بعدی بود
اما به علت اینکه متحرک نبود از همه طرف قابل دیدن نبود .
در مثال زیر یک کره به
شعاع ۵/۰ رسم میکنیم.
Dim Q
Q = gluNewQuadric
glColor4f 1 , 1 ,
0 , 1
gluQuadricDrawStyle
Q , qdsLine
glSphere Q , 0.5 ,
25 , 25
شاید برای شما این سوال
پیش آید که آیا تابع glColor4f هم وجود دارد؟ باید در پاسخ شما بگم که بله البته
که وجود داره. شکل کلی تابع glColor4f به صورت زیر است:
مقدار آلفا , رنگ آبی ,
رنگ سبز , رنگ قرمز glColor4f
در تابع بالا مقدار آلفا
رقیق یا غلیظ بودن سطح رو مشخص می کنه. به عبارت دیگه مقدار نوری که پاشیده می شود
از سطح(شئ) بگذرد یا نگذرد. (در جلسات بعدی چگونگی نورپردازی نیز آموزش داده می
شود.)
تمرین
۱- سعی کنین که یک مکعب متوازی الاضلاع رسم کنین و
اون رو متحرک کنین.
۲- قسمت های اصلی کره زمین (
پوسته و گوشته و هسته) را با رسم سه کره شبیه سازی کنین و سعی کنین هر قسمت یک رنگ
داشته باشد.(مثلا پوسته آبی , گوشته نارنجی , هسته قرمز)
قسمت 6
-------------------------------------------------------
در این قسمت یاد میگیرین
که دیسک رسم کنین و در ادامه نیز چگونگی چسباندن عکس به اشکال سه بعدی رو یاد
میگیرین.
۱- رسم استوانه:
۲- رسم دیسک:
۳- رسم دیسک مجهول(مثلا دیسک
نیم دایره)
برای رسم استوانه و دیسک
و دایره ما از کلاس 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
است و فقط یک پارامتر بیشتر دارد(پارامتر آخر) و این پارامتر مشخص کننده
مقدار مجهولی دیسک است
+ نوشته شده توسط امین حاجی علیزاده در چهارشنبه دوم آذر 1390 و ساعت
13:33 |
شناخت عبارت INSERT
ساختار دستور عبارت Insert شبيه به عبارت Select می باشد، بيشترين شکل مبنای آن عبارت است از:
INSERT [INTO] Table-or-View [(Column-List)]
VALUES (Value-List)
هر عبارت Insert می تواند يک جدول يا نما منفرد را به هنگام سازد. زمانی که شما از عبارت Insert برای به هنگام سازی يک نما استفاده می کنيد شما بايد آگاه باشيد از محدوديتهای زير:
View نبايد شامل يک تابع به هم پيوسته مانند COUNT يا AVG باشد.
View نبايد شامل Top ، GROUP BY ، UNION يا DISTINCT باشد.
View نبايد شامل يک ستون محاسبه شده باشد.
View بايد يک جدول را در شرط From باز گرداند.
عبارت Insert ستونهاي يک جدول منفرد را فقط به هنگام می سازد.
ليست ستون در عبارت Insert اختياری می باشد. اگر آن فراهم نگردد عبارت Insert بايد شامل مقاديری برای همه ستونها در جدول يا نما باشد و آنها بايد به همان ترتيب به عنوان ستونهايی در جدول يا نما فراهم شوند. اگر چه شما می توانيد از کليدهای ويژه DEFAULT برای مشخص کردن مقادير پيش فرض برای يک سطر استفاده کنيد. زمانی که ليست ستون گنجانده می شود. آن يک فرمت شبيه از ليست ستون در عبارت Select می گيرد: يک ليستی از نامهای ستون که با کاما جدا شده است. از زمانی که يک عبارت Insert می تواند يک سطر را فقط برای يک جدول اضافه کند، شما معمولاً نياز به استفاده کردن مشخصه نام جدول برای نام ستون نخواهيد داشت.
استفاده کردن از عبارت INSERT
يک عبارت Insert می تواند با استفاده کردن از قاب Grid برای مشخص کردن ستونها يا با استفاده کردن قاب SQL برای وارد کردن مستقيم عبارت ايجاد گردد.
درج کردن سطرها با استفاده از قاب Grid
قاب Grid احتمالاً آسانترين راه برای ايجاد يک عبارت Insert می باشد از زمانی که ياد آوردن هر ساختار دستور مورد درخواست شما نباشد.
درج کردن يک سطر با استفاده از قاب Grid
1- پوشه Tables را از پايگاه داده Aromatherapy راهبری کرده، جدول Oils را در قاب Details کليک راست می کنيم. در زير منوی Open Table رفته و Query را انتخاب می کنيم. Query Designer همه چهار قاب نشان داده شده را باز می کند.
راهنمايی: فرمان Query در Open Table يا زير منوی Open View يک راه سريعی برای باز کردن Query Designer با همه قابهای نشان داده شده می باشد. اگر چه حالت SQL پيش فرض SELECT*FROM می باشد Query اجرا نمی گردد بنابراين هيچ سطری باز نخواهد گشت.
2- قاب SQL و قاب Results را پنهان می سازيم.
3- دکمه Change Query Type را در نوار ابزار Query Designer کليک می کنيم و Insert را از ليست انتخاب می کنيم. Query Designer قاب Grid را تغيير می دهد بنابراين آن فقط ستون و سل ها با مقادير جديد را نشان می دهد.
4- ستون OilName را برای قاب Grid اضافه کرده و مقدار جديدش را InsertFromGrid قرار می دهيم.
5- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer يک متنی را نشان می دهد که سطر اضافه شده برای جدول را تأييد می کند.
6- OK را برای بستن جعبه متن کليک می کنيم. بدون بستن Query Designer يک نمای جديد از جدول Oils با کليک راست کردن جدول Oils در قاب Details باز می کنيم. بر روی جدول Open رفته و همه سطرهای بازگشتی را انتخاب می کنيم. يک نمونه جديد از Query Designer باز می شود و همه سطرها در جدول Oils را نشان می دهد.
7- پايين آوردن Scroll به آخر جدول اين موضوع را تأييد می کند که يک سطر جديد اضافه شده است.
مهم: OilID در پايگاه داده تان احتمالاً با ID که خودمان وارد می کنيم تطابق ندارد. به ياد داشته باشيد که OilID به عنوان يک Identity Column تعريف می گردد. موجوديت ستونها SQL Server ضمانت می کند که يکپارچه باشند اما آنها ضرورتاً پی در پی نمی باشند.
+ نوشته شده توسط امین حاجی علیزاده در دوشنبه نوزدهم اسفند 1387 و ساعت
11:7 |
ظرفيت هارد ديسك
ويندوزXPپس از نصب استاندارد ، فضايي بيش از 5 /1 گيگابايت از هارد را اشغال مي كند . شما با چند تغيير مي توانيد چند صد مگابايت از ظرفيت درايو را آزاد كنيد . براي اين كار بايد حالت Standby را غير فعال كنيد . اين عملكرد در ويندوزXP، فايل.sys Hiberfilدر فهرست اصلي را در پارتيشن سيستم قرار مي دهد . اگر به عملكرد Standby احتياجي نداريد ، آن را با دستور زير ، غير فعال كنيد :
Start > settings > Control panrl > power Options
درزبانه Power Schemesقسمت System Standby راروي Never تنظيم كنيد .
پاك سازي و مرتب سازي هارد از فايل هاي زائد
با استفاده از ابزار پاك سازي اطلاعات ، مي توانيد فايل هاي زائد و اضافي را پاك كنيد . درايوي را كه مي خواهيد مرتب سازي كنيد . انتخاب و دستور زير را اجرا كنيد :
star / programs / Accessories / Tools / Disk Cleanup
نمايش گروهي
براي اين كه بتوانيد همه فايل هاي موجود را به صورت يك فهرست درWindows Explorerنمايان كنيد از طريق منويViewوارد قسمتArrange lcon Byشويد وTypeرا فعال كنيد .
غير فعال كردن خاصيتwinzipدر ويندوز
در كامپيوتر هاي با سرعت پايين ، عملZipبه عنوان ترمزي براي سرعت سيستم به حساب مي آييد . اگر با يكPCبا سرعت پايين كار مي كنيد . توصيه مي شود كه اين عملكرد را غير فعال كنيد . از طريقstart / Runخط فرمان را باز كنيد و در سطر فرمان دستورzipfldr .dllRegsvr32 /Uرا تايپ كنيد . پس از تاييد توسط كليدOK، پيغامي ظاهر مي شود كه عمل غير فعال ، در همان مسير قيد شده در سطر فرمان دستورRrgsvr32 zepfldr . dllرا وارد كنيد .
ايجاد يك آيكون براي قفل كردن كامپيتر
نحوه ايجاد آيكني كه مي توانيد با دو بار كليك سريع آن ، سيستم رت در وضعيتLockقرار دهيد . براي چنين كاري ابتدا در صفحهDesktipراست كليك كرده و سپس گزينهshortcutNew / راانتخاب كنيد . در كادر متنيType the Location of lte ltemدستور زير را وارد نماييد :
rundll32 . exe user32 . dll . Lockworkstation
سپس گزينهNextرا انتخاب كرده و يك نام دلخواه براي ميانبر مزبور انتخاب كنيد . پس ازاين مرحله مي توانيد با قرار دادن آيكون ميانبر در هر محل دلخواهي با دو بار كليك سريع در آن سيستم رت در وضعيت قفل قرار دهيد .
My Document را جابجا كنيد
روي آيكونMy Documentدر صفحه نمايشتان ، كليك راست كنيدpropertiesو از پنجره ظاهر شده دكمهMoveرا انتخاب كنيد ، پوشه اي را كه قرار است محتوايMy Documentخود را به آن ، انتقال دهيد . اگر پوشه مورد نظرتان وجود ندارد مي توانيد از طريق گزينهMake New folderپوشه جديدي براي خود انتخاب كنيد .
نحوه استفادهRemote Desktop
شركت ماكروسافت با قرار دادن برنامهRemote Desktopدر نسخهXp professionalخود اين امكان را براي كار بران فراهم ساخت تا از راه دور به كامپيوتري در محل ديگر دسترسي يابند . در واقع شيوه كار اين برنامه به نحوي است كه به نحوه برقراري ارتباط ، سيستم راه دور به طور اتوماتيكLockمي شود و مادامي كه به آن مرتبط هستيد هيچ شخص ديگري نمي توتند به برنامه ها ، فايل ها و ساير منابع آن دسترسي داشته باشيد و هنگامي كه به محل كارتان باز گرديد مي توانيد آن را با فشار دادن كليد هاي Alt+CTRl+DEL از حالتLock خارج نماييد . از ديگر ويژگي هاي اين برنامه امكانloginدر يك زمان بر روي چند سيستم مي باشد ، حتي در حالتي كه ديگران نيز به آن سيستمLog inكرده باشند ، كار بر مي تواند برنامه هاي آن ها را بطور همزمان اجرا كند . براي دسترسي به امكانات و اجراي اين برنامه بايد موارد زير را در نظر داشته باشيد :
- يك كامپيوتر كه در آن ويندوزXP professional نصب شده و دسترسي به محيط اينترنت و يا شبكه را دارد .
- يك كامپيوتر ديگر در منزل و يا در همان محل شركت ( كه از طريق شبكه داخلي با هم مرتبط هستند ) با امكان دسترسي به اينتربت و مودم .
- نام كاربري، كلمه رمز عبور و مجوز هاي مناسب
نصب فكس
براي فعال كردن اين ويژگي در ويندوزتان ( البته در ويندوزXP) كافي است از پنجره Add / remove program panelControlو سپسComponenents Add / Remove Windowsرا انتخاب كنيد و از پنجره ظاهر شده گزينهFax Servicesرا برگزينيد دكمهNextرا انتخاب كنيد . پس از اين از شما براي نصب ، سي دي ويندوزتان را مي خواهيد كه با گذاشتن آن ، اين برنامه نصب مي شود .
فكس بفرستيد
براي اين كارDocumentمورد نظر را كه مي خواهيدFaxكنيد ، باز كرده و از منويfileگزينهprintرا انتخاب و در پنجرهprinter Boxبر روي گزينهFaxكليك كنيد تا ويزاد SendFaxباز شود ( توجه داشته باشيد در برنامه هايOfficeبراي اين كار بايد از منويfileگزينهSendو سپسFax Recipientرا انتخاب كنيد . ويزاردي با همان صورت ظاهر مي شود ) در مرحله بعد نوبت به اضافه كردن نام فردي مي شود كه مي خواهيد به ويFaxبزنيد . پس از طي اين مرحله ، آماده ايدDocumentخود را از طريقFaxبفرستيد .
فشرده كردن فايل ها
براي فشرده كردن يك فولدرXPياMeروي صفحهDesktopيا درون يك فولدر راست كليك كرده ، از منوي ظاهر شدهNewراانتخاب كنيد و سپس روي گزينهCompressed ( zipped ) folderكليك كنيد . يك فولدر جديد از ن.ع فشرده
( Compressed )در آن محل ايجاد مي شود كه نام پيش فرض آن( Ziped ) Folder New Compressedاست .
فولدر هاو فايل ها يي كه مي خواهيد روي آنها پسورد بگذاريد انتخاب كنيد و با استفاده ازCutوPasteبه اين فولدر فشرده انتقال دهيد .
رمز گذاري روي فايل ها
فولدر فشرده را باز كنيد و از منوي فايل گزينهAdd a password( در ويندوزMeگزينهEncrypt) را انتخاب كنيد . كلمه عبور دلخواه خود را در قسمتPasswordوارد كنيد و دوباره آن را در قسمتConfirm Passwordتايپ كنيد و دكمهOKرا بزنيد . از حالا به بعد تنها كاربراني كه كلمه عبور را بدانند قادر به باز كردن ، كپي يا انتقال محتويات اين فولدر هستند .
منويFavoriteرا رويDesktopقرار دهيد
از منويStartگزينهRunرا انتخاب كنيد . حال در قسمتOpenاز اين پنجره ، عبارت زير را تايپ كنيد :
iexplore- Channelband
توجه داشته باشيد كه ميان عبارتiexploreو علامت – يك فاصله قرار دهيد .
پس از تاييد پنجرهOpenمنويFavoritesرا روي صفحه نمايشتان خواهيد ديد .
+ نوشته شده توسط امین حاجی علیزاده در چهارشنبه نهم مرداد 1387 و ساعت
9:23 |
فرق بین Multi Program و Multi Task چیست؟
سئوال 1: در multi program چه موقع عمل switching انجام می گیرد؟ وقت I/O
سئوال 2: در multi task چه موقع عمل switching انجام می گیرد؟ در یک برهه زمانی یعنی فقط منتظر عمل I/O
نمی ماند اگر به I/O بر خورد کند switch می کند. ولی اگر به I/O بر خورد نکند و آن برهه زمانی بگذرد بازهم switch می کند. یعنی پردازنده از آن گرفته می شود.
نکته1: یک سیستم عامل میتواند چند برنام ه(Multi program) باشد ولی چند وظیفه ای(Multi Task) نباشد. مثل ویندوز 1و2و3
چون فقط به I/O برخورد می کردند پردازنده Switch می کرد.
نکته2: یک سیستم عامل که هم چند برنامه(Multi program) و هم چند وظیفه ای(Multi Task) باشد. مثل ویندوز 95و98
چون اگر چند پنجره را باز کنید می بینید همه پنجره ها در حال فعلیت هستند. یعنی پردازنده ما بین آنها Switch می کند .
نکته 3: اشتراک زمانی (Time Sharing ) وقتی است که سیستم چند کاربره(Multi User) باشد.
مثال : وینوز 2000 و time sharing و multi task است. N تا کاربر بتوانند از طریق شبکه به یک سیستم وصل شوند و کاملا منابع اش را به اشتراک بگذارد. در ویندوز NT - n تا کاربر به آن سیستم می یابند و از منابع سیستم استفاده می کنند.
نکته 4: در وینروز95و 98 همه منابع غیر از حافظه و پردازنده را می توانیم به اشتراک بگذاریم.ولی در وینروز NT و ویندوز 2000و یونیکس همه منابع را می توانیم به اشتراک بگذاریم.
دو نکته ضرورت چند وظیفه ای بودن را روی کامپیوتر های شخصی موجب شده اند.{استالینگ 87}
1- با افزایش سرعت و ظرفیت ریز پردازند ه ها و با حمایت از حافظه مجازی ، کاربر ده پیچیده تر و مرتبتر شده اند .
برای مثال ممکن است کاربران بخواهند یک برنامه ، word ، یک برنامه Excel ، یک برنامه Autocad
را به طور همزمان برای ایجاد یک سند به کار برند.
1- باز کردن برنامه Autocad
2- رسم شکل و ذخیره آن
3- بستن برنامه Autocad
4- بازکردن Word
5- درج شکل در محل مناسب
در محیط چند وظیفه ای کاربر هر یک از کاربرد های مورد نیاز خود را باز کرده و به صورت باز رها می کند . و
اطلا عات به سادگی می تواند بین چند کاربرد حرکت کند.
ولی در تک وظیفه ای اگر تغییری در شکل لازم باشد کاربر باید برنامهWord را ببندد، برنامه Autocad را باز کند ، شکل را ویرایش و ذخیره نماید ، برنامه Autocad راببندد، برنامه Wordرا باز کند ودر نهایت شکل ویرایش شده را درج کند . که خیلی ملال آور است.
1- برای عملکر چند وظیفه ای ، رشد به کار گیری کامپیوتر به صورت مشتری / خدمتگزار(Client/Server) می باشد. در این دید گاه یک کامپیوتر شخصی (Client ) و یک سیستم میزبان(Server) مشتر کا، برای انجام یک کاربرد،خاص، بک کار گرفته شده اند. این تر تیب در یک کاربرد ممکن است یک یا چند کامپیوتر شخصی و یک یا چند دستگاه خدمتگزار (Client ) در گیر باشند.
برای هر کدام از وقفه ها ما سرویس روتین مربوط به خودش را داریم .
+ نوشته شده توسط امین حاجی علیزاده در شنبه ششم بهمن 1386 و ساعت
12:9 |