تبليغاتX
Iranian Technology
 
آموزش برنامه نویسی
 
 
آموزش ویژوال بیسیک و ... برای دیدن تمامی مطالب به آرشیو ماهانه مراجعه کنید
 

سلام خدمت دوستان.

وضع نظر دادناتون خیلی خرابه. من که اینهمه آموزش میزارم ارزش یه نظر کوچولو رو ندارم ؟! خیلی بی معرفتین . تنها کسی که به من نظر میده R.S هست که دمش گرم .

R.S از اینکه دیر آپ کردم شرمنده ، همش تغصیر این بی معرفتاست .

ولش کن این حرفا که فایده ای نداره .

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

برای دیدن آموزش برین ادامه مطلب  ß


ادامه مطلب
 |+| نوشته شده در  سه شنبه بیست و پنجم تیر 1387ساعت 16:14  توسط علی  | 

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

امیدوارم حالتون خوب باشه .

از کلیه افرادی که نظر دادن و از این به بعد می خوان نظر بدن ممنونم.

در این پست با نحوه ی تکنیک Blending یا به زبون خودمون مخلوط کردن رنگ ها باهم آشنا میشیم.

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

خوب برای دیدن آموزش ها برین ادامه مطلب ß
ادامه مطلب
 |+| نوشته شده در  جمعه هفتم تیر 1387ساعت 21:53  توسط علی  | 

سلام.

اول از همه ولادت حضرت فاطمه (س) و روز مادر رو به شما تبریک می گم .

از کلیه دوستانی که نظر دادن ممنونم . به خصوص R.S بابا مگه ساعت ۶ صبح تو خواب نداری نظر میدی .  از این که دیر آپ کردم شرمنده .  
چند تا از دوستان نظر داده بودن و سؤالاتی رو پرسیده بودن که پاسخ همه ی دوستان رو آخر همین پست گذاشتم . بازم از اینکه دیر آپ کردم شرمنده ولی دیگه از این به بعد زود آپ می کنم.
 

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


ادامه مطلب
 |+| نوشته شده در  چهارشنبه پنجم تیر 1387ساعت 20:2  توسط علی  | 

سلام به همه ی علاقه مندان به برنامه نویسی . من دوباره پیدام شد .  اونم بعد یه عمر . میدونم منو بخشیدید  . نبخشیدید ؟  به زور هم که شده باید منو ببخشید.

قبل از اینکه حرفی بزنم خیلی خیلی ازتون گله دارم . اینقدر نظرات زیاد بود که کلافه شدم. بابا بی معرفتا این وضع نظر دادنه . از ۶ فروردین تا حالا فقط ۴ تا نظر؟!.  زیاد بود نه ؟   من اول هر پستی میام یه ساعت در مورد نظر دادن شما حرف می زنم تا شما یه کم معرفت به خرج بدین. ولی خوب مث این که فایده ای نداره .  کلآ از وبلاگ و این جور چیزا دیگه ناامید شدم. مارو باش توی امتحان ها برای شما مطلب میزارم . .. هی ..... توی دلت چی گفتی ؟؟؟  زود باش بگو .

البته اون چهار نفری هم که نظر دادن دمشون گرم . تازه لازمه بگم از اون ۴ تا نظر ۲ تاشون تبلیغ مبلیغ بود !! فعلا بی خیال ای حرفا .

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

برای دیدن ادامه مبحث OpenGL برین ادامه مطلب ------->  خوش بگزره ... 

 


ادامه مطلب
 |+| نوشته شده در  چهارشنبه پانزدهم خرداد 1387ساعت 17:27  توسط علی  | 

اختصاص بافت Texture به اشکال سه بعدی و اشکال کلاس Quadric :

 

با سلام خدمت دوستان . عیدتون مبارک .

از این که یه چهار پنج ماهی نبودم شرمنده . توی این چند وقت فقط هشت تا نظر دادین واقعآ دمتون گرم. بعد یه عمر یه کارت اینترنت یه ساعته گیر آوردم به عشق پست کردن عیدی شما و دادن یه عیدی بی ارزش به شما دوستان اما با این نظرات حالمو گرفتین . بابا دمتون گرم گل کاشتین. این حرفهایی که زدم برای کسایی بود که میان داخل ویلاگ اما هیچ نظری نمیدن.

اما شما دوستان. حالتون خوبه . خوب اللهی شکر.

 

خوب بریم سر آموزش بدون مقدمه :

 

برای دیدن آموزش برین ادامه مطلب.


ادامه مطلب
 |+| نوشته شده در  سه شنبه ششم فروردین 1387ساعت 10:52  توسط علی  | 

با یاد خدا قسمت ششم هم شروع میکنیم.

از اینکه نظر می دین خیلی ممنونم. با این نظراتی که میدین منو شارژ می کنید و باعث میشید که من مطالب جدید رو با ذوق و شوق بنویسم. در جواب نظر آقا حسین باید بگم ما چاکر همه شما هستیم از اینکه یه سایت آپلود رایگان به من معرفی کردی خیلی ممنون.

 

یکی از دوستان به نام رویال بابل سوال کرده بودن که چطوری میشه ساعت جاری سیستم رو در ویژوال بیسیک به نمایش در آورد؟ در جواب باید بگم این کار بسیار آسونه و من متعجبم که چطور شما نمی تونین ساعت جاری سیستم رو نمایش بدین. خلاصه به این صورت باید عمل کنی:

یک تایمر به فرم خودت اضافه کن و خاصیت Interval تایمرت رو برابر ۱۰۰۰ بگیر.سپس یک تکست باکس (TextBox) در فرم خودت بگذار . روی تایمر ۲ بار کلیک کن تا پنجره کدها باز شود و بعد کدهای زیر رو بنویس:

Private sub Timer1_Timer

Text1.Text = Time

end Sub

به همین سادگی ...  به همین خوشمزگی

 

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


خوب میریم سراغ آموزش قسمت ششم 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 است و فقط یک پارامتر بیشتر دارد(پارامتر آخر)  و این پارامتر مشخص کننده مقدار مجهولی دیسک است.

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


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

 

 |+| نوشته شده در  شنبه دوم تیر 1386ساعت 12:22  توسط علی  | 

سلام...

حالتون چطوره؟ خوبین یا بهترین؟          خوب خدا رو شکر.

در این جلسه قبل از اینکه بریم سر اصل مطلب براتون یک سایت می خوام معرفی کنم:

اگه برنامه نویسی به زبان دلفی بلدین و می خواین که با این زبان برنامه نویسی کارهای سه بعدی انجام بدین می تونید به این سایت مراجعه کنین:آموزش OpenGL در دلفی(Delphi)


خوب میرویم سر آموزش قسمت پنجم OpenGL

در این جلسه یاد میگیرین که:

۱- رسم مکعب:

۲- رسم کره:

۳- رسم منشور و اهرام( مکعب مثلث):

۴- رسم استوانه ( یا دیسک):

در این جلسه چگونگی رسم مکعب و کره و اهرام را میدم و رسم استوانه را  برای جلسه بعد . چرا که رسم استوانه و دیسک کاملا با بقیه مکعب ها فرق داره و مستلزم اختصاص دادن وقت بیشتری برای آموزش آن داره پس برای رسم مکعب خودتون رو آماده کنین.

 

۱- رسم مکعب (مکعب مربع و مستطیل):

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

در تابع بالا مقدار آلفا رقیق یا غلیظ بودن سطح رو مشخص می کنه. به عبارت دیگه مقدار نوری که پاشیده می شود از سطح(شئ) بگذرد یا نگذرد. (در جلسات بعدی چگونگی نورپردازی نیز آموزش داده می شود.)


این قسمت هم به پایان رسید. و اما تمرین این جلسه شما:

۱- سعی کنین که یک مکعب متوازی الاضلاع رسم کنین و اون رو متحرک کنین.

۲- قسمت های اصلی کره زمین ( پوسته و گوشته و هسته) را با رسم سه کره شبیه سازی کنین و سعی کنین هر قسمت یک رنگ داشته باشد.(مثلا پوسته آبی , گوشته نارنجی , هسته قرمز)

یه وقت برای انجام تمرین ها تنبلی نکنین ها !

اگه احیانآ مشکلی پیش اومد در قسمت نظرات بگو . حتما جوابتو می گیری.

 

 |+| نوشته شده در  پنجشنبه سی و یکم خرداد 1386ساعت 10:9  توسط علی  | 

با سلام خدمت تمام بروبچ گل .

از نظراتی که دادین ممنون.

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

آقا سیاوش پرسیده بودن که : کسی که میخواد برنامه نویسی یاد بگیره باید تمام کدهایی رو که مینویسه بلد باشه؟ باید بگم که بله البته که باید از کدهایی که مینویسه سر در بیاره . همچنین شعار من اینه که هیچوقت برای اینکه یک برنامه بنویسی از روی مطالب جای دیگر رونویسی نکن بلکه با تمرین خودت سعی کن که برنامه بنویسی.

بازم آقا سیاوش پرسیده بود که : چطور میشه Object های 3d رو در OpenGL به کابرد؟ برای اینکه ما از Object های 3d در OpenGL استفاده کنیم باید تمامی مبانی حرفه ای ۳ بعدی OpenGL رو یاد بگیریم . من در جلسات بعدی چگونگی استفاده از object های ۳ بعدی در OpenGL رو براتون پست میکنم.

خوب بد بختانه سوالات بسیار کم بود و ... .


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

در جسه چهارم آموزش OpenGL یاد میگیرین که :

۱- اشیای خود را با چند رنگ مختلف رسم کنین. (برای مثال گوشه بالا سمت راست آبی و نیمه پایینی مربع قرمز باشد و وسط مربع نیز ترکیبی از این دو رنگ.)

۲- اشیای سه بعدی رسم کنین.

۳- چگونگی متحرک سازی اشیای سه بعدی.

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

۱- رنگ آمیزی اشیا:

یکی از قابلیت های مهم 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 قرار دهید و نتیجه رو نگاه کنین.


مهمترین بخش آموزش OpenGL :

۲- رسم اشیای سه بعدی:

برای رسم اشیای سه بعدی همانند رسم اشیای ۲ بعدی عمل میکنیم . یعنی اینکه با فراخوانی بلوک 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 باشد که در غیر این صورت...


جلسه چهارم آموزش OpenGL نیز به پایان رسید ولی کلاغه به خونش نرسید. و کسی هم نظر نداد.

امیدوارم تا جلسه آینده خوب تمرین کنین.

فعلا . خدا حافظ      ...................     رو بیامرزه.

راستی اگه سایتی که فضای رایگان برای آپلود فایل به صورت رایگان میده بلدی بگو ممنون می شوم.

با تشکر                                    Iranian Technology

 

 |+| نوشته شده در  پنجشنبه سی و یکم خرداد 1386ساعت 10:8  توسط علی  | 
با یاد خدا امروز قسمت سوم آموزش OpenGL رو برای شما عزیزان میگم.

در جلسه قبل رسم نقطه و خط رو گفتم اما امروز به بقیه ی اشیا میپردازم.

۳- 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

همین !!

اگه میخوای این مطالبو خوب یاد بگیری باید تمرین کنی. از روی نوشته کپی کردن باعث میشه که اصلا چیزی یاد نگیرین. پس سعی کنین:

۱- چهار ضلعی رسم کنین که رنگ آن قرمز باشد. سپس در وسط آن چهار ضلعی یک مثلث به رنگ آبی رسم کنین.

۲- دایره ای رسم کنین که رنگ آن سبز باشد .

امیدوارم موفق باشید.  راستی من  سه چهار روز دیگه تمرین هایی که برای شما نوشتم رو جواب میدم پس هیچ جای نگرانی نیست.


هی اگه نظر ندین ها دیگه هیچ مطلبی رو نمی نویسم.

دروغ گفتم بابا حالا ناراحت نشو ولی اگه نظر ندی نامردیه.

 |+| نوشته شده در  چهارشنبه بیست و سوم خرداد 1386ساعت 19:36  توسط علی  | 
با سلام خدمت تمام بروبچ .

امروز درباره ساخت اشیای دو بعدی در ویژوال بیسیک و رنگ آمیزی آنها صحبت میکنیم.

ابتدا یه مروری به جلسه قبل میکنیم و همون طور که قول داده بودم کدهای جلسه اول رو براتون به صورت کلی مینویسم (اگه میخوایین این کدها رو بنویسین پیشنهاد میکنم کپی کنید.):

کدهای زیر برای ماجول OpenGLMain است:

توجه:اگر جلسه اول آموزش OpenGL رو نخوندی حتما بخونش.

کدهای زیر برای ماجول DrawShape هست:

و اما درس امروز:

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


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

۱- نقطه ای رسم کنید که انداره اون ۲۵ برابر نقطه معمولی باشه و دندانه نداشته باشد.

۲- با رسم ۳ خط یک مثلث بسازین.

امیدوارم موفق باشی .

راستی اگه مشکلی پیش اومد نظر یادت نره ها

فعلا

 |+| نوشته شده در  سه شنبه بیست و دوم خرداد 1386ساعت 12:58  توسط علی  | 
با سلام خدمت تمام بروبچ برنامه نویس ایران زمین.

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

از همین اول کار شرط میبندم که از این آموزش لذت میبرین چون با حرفه ای شدن در زمینه OpenGL میتونید برنامه هایی از قبیل برنامه های میکس و افکت گزاری روی تصاویر و ساختن بازی های سه بعدی قدرتمند انجام بدین.

حالا اونایی که در این ضمینه (یعنی کارهای سه بعدی) یه مقدار تجربه دارن این سوال برای اونها پیش بیاد که چرا OpenGl ؟

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

خوب من به سوالات شما جواب میدم. من به این علت آموزش OpenGL رو میذارم چون :

شاید با بازی قدرتمند Doom آشنایی داشته باشید منظور من از این جمله اینه که بازی Doom با OpenGL برنامه نویسی شده.همچنین OpenGL نسبت به DirectX قدرت بیشتری داره و با سرعتی در حدود ۳ برابر DirectX کار میکنه و مقدار حافظه کمتری اشغال میکنه.

هرچند OpenGL مزایای بسیار زیادی داره ولی تعداد خطوطی که ما باید کد بنویسیم بیشتره و وقت بیشتری صرف نوشتن برنامه با OpenGL میشه.اما این ضرر OpenGL هم قابلیت رفع داره برای رفع این مشکل ما با ساختن یک موتور(Engin) گرافیکی ساده ولی قدرتمند تعداد خطوطی که باید کد بنویسیم نصف و شاید هم کمتر از نصف DirectX بشه.

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

به احتمال ۹۸٪ شما کتابخانه( OpenGL (vbogl.tlb رو در داخل کامپیوترتون ندارین اما من این رو از قبل پیش بینی کردم. و لینک دانلود کتابخانه OpenGL رو براتون گذاشتم.

Download VBOpenGL 1.2 for Microsoft

                  

بعد از اینکه فایل مورد نظر رو دانلود کردین ویژوال بیسیک رو باز کنین و از منوی 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()                          'X
  
   If hrc Then
   If wglMakeCurrent(0, 0) = 0 Then
   MsgBox "Rilase DC and RC Failed.", vbInformation, "ShutDownError"                     'X
   End If
   If wglDeleteContext(hrc) = 0 Then
   MsgBox "Failed", vbInformation, "ERROR"                       'X
   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

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

اگه از این آموزش خوشتون اومد یک نظر بدین تا قسمت دوم رو هم بزارم.

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

 |+| نوشته شده در  سه شنبه پانزدهم خرداد 1386ساعت 21:23  توسط علی  | 
 
  بالا  

Free Counter