OpenGL یک ابزار برنامه نویسی سه بعدی قدرتمند است که برای ترسیم صحنه های سه بعدی پیچیده از ابتدایی ساده استفاده می شود. این مقاله به شما آموزش می دهد که چگونه یک مکعب ساده بکشید تا بتوانید آن را به صورت سه بعدی بچرخانید!
برای این پروژه به ویرایشگر کد و دانش برنامه نویسی C نیاز دارید.
مراحل
قسمت 1 از 3: راه اندازی اولیه
مرحله 1. نصب OpenGL برای شروع مراحل زیر را برای نصب OpenGL بر روی سیستم خود دنبال کنید
اگر قبلاً OpenGL و همچنین کامپایلر C سازگار دارید ، می توانید این مرحله را رد کرده و به مرحله بعدی بروید.
مرحله 2. سند را ایجاد کنید
یک فایل جدید در ویرایشگر کد مورد علاقه خود ایجاد کنید و آن را به عنوان mycube.c ذخیره کنید
مرحله 3. اضافه کردن #شامل
اینها شامل موارد اساسی است که برای برنامه خود نیاز دارید. مهم است بدانیم که در واقع انواع مختلفی برای سیستم عامل های مختلف مورد نیاز است. اطمینان حاصل کنید که همه این موارد را شامل می شود تا مطمئن شوید برنامه شما همه کاره است و می تواند برای هر کاربری اجرا شود.
// شامل #شامل #شامل #شامل #شامل #تعریف GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #شامل #دیگر #شامل #endif
مرحله 4. نمونه های اولیه تابع و متغیرهای جهانی را اضافه کنید
گام بعدی شما اعلام برخی از نمونه های اولیه عملکرد است.
// Function Prototypes void display ()؛ void specialKeys ()؛ // متغیرهای سراسری double rotate_y = 0؛ double rotate_x = 0؛
مرحله 5. تابع main () را تنظیم کنید
int main (int argc، char* argv ) {// مقداردهی اولیه GLUT و پردازش پارامترهای کاربر glutInit (& argc، argv)؛ // درخواست پنجره رنگی بافر دوگانه با Z-buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) ؛
مرحله 6. پنجره را ایجاد کنید
گام بعدی این است که ایجاد پنجره درون آن مکعب را ترسیم می کنید. در این آموزش ، پنجره "مکعب عالی" نامیده می شود.
// ایجاد پنجره glutCreateWindow ("مکعب عالی") ؛
مرحله 7. تست عمق را فعال کنید
OpenGL یک زبان سختگیرانه است زیرا فرض نمی کند هیچ ویژگی خاصی فعال باشد. برای اینکه برنامه شما با استفاده از Z-buffer که قبلاً به آن نگاه کرده اید به درستی در سه بعد نمایش داده شود ، باید این کار را انجام دهید تست عمق را فعال کنید به همانطور که به کاوش OpenGL ادامه می دهید ، بسیاری از ویژگی هایی را که برای فعال کردن آنها نیاز دارید ، از جمله روشنایی ، بافت ، نمای رو به جلو و موارد دیگر را پیدا خواهید کرد.
// فعال کردن آزمون عمق بافر Z glEnable (GL_DEPTH_TEST) ؛
مرحله 8. توابع تماس را اضافه کنید
در اینجا توابع فراخوانی است که نمونه های اولیه آن را قبلاً نوشته اید. هر بار از طریق حلقه اصلی ، این توابع فراخوانی می شوند. عملکرد صفحه نمایش را بر اساس هرگونه تغییر در متغیرهایی که از فراخوان قبلی ایجاد شده است ، دوباره ترسیم می کند. عملکرد specialKeys به ما امکان می دهد با برنامه تعامل داشته باشیم.
// توابع فراخوانی glutDisplayFunc (نمایش) ؛ glutSpecialFunc (specialKeys) ؛
مرحله 9. MainLoop را راه اندازی کنید
با این کار تا زمانی که برنامه را نبندید و اجازه ایجاد انیمیشن و تعامل با کاربر را ندهید ، عملکرد اصلی را فراخوانی می کند.
// گذراندن کنترل به GLUT برای رویدادها glutMainLoop ()؛ // بازگشت به سیستم عامل بازگشت 0؛ }
قسمت 2 از 3: تابع () display ()
مرحله 1. هدف این تابع را درک کنید
تمام کارهای رسم مکعب شما در این تابع انجام می شود. ایده کلی پشت مکعب شما این است که هر شش ضلع را به صورت جداگانه بکشید و آنها را در موقعیت مناسب قرار دهید.
از نظر مفهومی ، هر طرف با تعریف چهار گوشه و اجازه دادن به OpenGL خطوط را متصل کرده و آن را با رنگی که شما تعریف می کنید ، ترسیم می کند. در زیر مراحل انجام این کار آمده است
مرحله 2. glClear () را اضافه کنید
اولین گامی که باید در این تابع بردارید این است که رنگ و بافر Z را پاک کنید به بدون این مراحل ، نقشه های قدیمی ممکن است همچنان در زیر نقاشی های جدید قابل مشاهده باشند و اشیاء ترسیم شده در مکان مناسب روی صفحه قرار نگیرند.
void display () {// پاک کردن صفحه و Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ؛
مرحله 3. glBegin () و glEnd () را اضافه کنید
OpenGL اشیاء را ترکیبی از چند ضلعی های مختلف تعریف می کند. با استفاده از glBegin () فرمان ، شما به طور موثری مدادی را می گذارید که شکل را ترسیم می کند. برای بلند کردن مداد و شروع یک شکل جدید ، باید از آن استفاده کنید glEnd () فرمان در این آموزش شما از GL_POLYGON برای رسم هر طرف مکعب استفاده خواهید کرد اما می توانید از پارامترهای دیگر مانند GL_LINE ، GL_QUAD یا GL_TRIANGLE برای ایجاد اشکال دیگر استفاده کنید.
- در اینجا شما باید از قسمت جلوی مکعب خود شروع کنید. بعداً به هر 6 طرف رنگ اضافه می کنید.
// سمت چند رنگ - FRONT glBegin (GL_POLYGON) ؛ // Vertices در مرحله بعدی اضافه می شود glEnd ()؛
مرحله 4. glVertex3f () را اضافه کنید
هنگامی که اظهار داشتید که می خواهید چند ضلعی خود را شروع کنید ، باید این کار را انجام دهید راس ها را تعریف کنید از شی بسته به آنچه می خواهید با شیء خود انجام دهید ، glVertex دارای چندین فرم است.
- اولین مورد این است که در چند بعد کار می کنید. 3 مورد فوق در glVertex3f می گوید شما در 3 بعد طراحی می کنید. همچنین امکان کار در 2 یا 4 بعد وجود دارد. f بالا در glVertex3f می گوید شما با اعداد نقطه شناور کار می کنید. همچنین می توانید از شورت ، عدد صحیح یا دو نفره استفاده کنید.
- توجه کنید که این نقاط در a تعریف شده اند پادساعتگرد شیوه. این در حال حاضر چندان مهم نیست ، اما هنگامی که شروع به کار با نور ، بافت و رو به جلو می کنید ، این امر فوق العاده مهم خواهد شد ، بنابراین عادت کنید که نقاط خود را در خلاف جهت عقربه های ساعت مشخص کنید.
- رئوس بین خطوط glBegin () و glEnd () را اضافه کنید.
// سمت چند رنگ - FRONT glBegin (GL_POLYGON) ؛ glVertex3f (-0.5 ، -0.5 ، -0.5) ؛ // P1 glVertex3f (-0.5 ، 0.5 ، -0.5) ؛ // P2 glVertex3f (0.5 ، 0.5 ، -0.5) ؛ // P3 glVertex3f (0.5 ، -0.5 ، -0.5) ؛ // P4 glEnd ()؛
مرحله 5. glColor3f () را اضافه کنید
glColor مشابه glVertex کار می کند. می توانید نقاط را به عنوان شورت ، صحیح ، دو نفره یا شناور تعریف کنید. هر رنگ دارای مقداری از 0 تا 1 است. همه صفرها نقطه را سیاه و همه 1 ها نقطه را سفید می کند. 3 در glColor3f () به سیستم رنگی RGB بدون کانال آلفا اشاره دارد. آلفا یک رنگ شفافیت آن را مشخص می کند. برای تغییر سطح آلفا ، از glColor4f () استفاده کنید که آخرین پارامتر آن مقدار 0 تا 1 برای مات به شفاف است.
- هنگام فراخوانی glColor3f () هر راس از آن نقطه به بعد از آن رنگ خواهد بود. بنابراین ، اگر می خواهید هر چهار راس قرمز باشند ، کافیست قبل از دستورات glVertex3f () یکبار رنگ را تنظیم کنید و همه رئوس قرمز می شوند.
- قسمت جلویی که در زیر تعریف شده است نحوه تعیین رنگ جدید برای هر راس را نشان می دهد. وقتی این کار را انجام می دهید ، می توانید یک ویژگی جالب از رنگ های OpenGL را مشاهده کنید. از آنجا که هر راس چند ضلعی رنگ خاص خود را دارد ، OpenGL به طور خودکار رنگها را ترکیب می کند! مرحله بعدی نحوه اختصاص چهار راس با یک رنگ را نشان می دهد.
// سمت چند رنگ - FRONT glBegin (GL_POLYGON) ؛ glColor3f (1.0 ، 0.0 ، 0.0) ؛ glVertex3f (0.5 ، -0.5 ، -0.5) ؛ // P1 قرمز glColor3f است (0.0 ، 1.0 ، 0.0) ؛ glVertex3f (0.5 ، 0.5 ، -0.5) ؛ // P2 سبز glColor3f است (0.0 ، 0.0 ، 1.0) ؛ glVertex3f (-0.5 ، 0.5 ، -0.5) ؛ // P3 آبی glColor3f است (1.0 ، 0.0 ، 1.0) ؛ glVertex3f (-0.5 ، -0.5 ، -0.5) ؛ // P4 بنفش glEnd () است؛
مرحله 6. طرفهای دیگر را کنترل کنید
بررسی کنید که مکان هر راس برای پنج ضلع دیگر مکعب چگونه خواهد بود اما برای سادگی ، این موارد برای شما محاسبه شده است و در تابع نمایشگر نهایی () در زیر
// سمت سفید - BACK glBegin (GL_POLYGON) ؛ glColor3f (1.0 ، 1.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) ؛ glEnd ()؛ // طرف بنفش - RIGHT glBegin (GL_POLYGON) ؛ glColor3f (1.0 ، 0.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) ؛ glEnd ()؛ // سمت سبز - LEFT glBegin (GL_POLYGON) ؛ glColor3f (0.0 ، 1.0 ، 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) ؛ glEnd ()؛ // سمت آبی - TOP glBegin (GL_POLYGON) ؛ glColor3f (0.0 ، 0.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) ؛ glEnd ()؛ // سمت قرمز - BOTTOM glBegin (GL_POLYGON) ؛ glColor3f (1.0 ، 0.0 ، 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) ؛ glEnd ()؛ glFlush ()؛ glutSwapBuffers ()؛ }
ما همچنین می خواهیم دو خط آخر کد را برای این تابع اضافه کنیم. اینها هستند glFlush ()؛
و glutSwapBuffers ()؛
که اثر بافر دوگانه ای را که قبلاً در مورد آن یاد گرفته اید به ما می دهد.
قسمت 3 از 3: تعامل کاربر
مرحله 1. specialKeys () را اضافه کنید
کار شما تقریبا تمام شده است ، اما در حال حاضر می توانید یک مکعب را بکشید اما راهی برای چرخاندن آن ندارید. برای انجام این کار ، شما می خواهید ایجاد specialKeys () عملکرد به ما اجازه می دهد تا کلیدهای جهت دار را فشار داده و مکعب را بچرخانیم!
- این تابع به همین دلیل است که متغیرهای جهانی rotate_x و rotate_y را اعلام کردید. وقتی کلیدهای جهت دار راست و چپ را فشار می دهید ، rotate_y 5 درجه افزایش یا کاهش می یابد. به طور مشابه ، هنگامی که کلیدهای جهت دار بالا و پایین را فشار می دهید ، rotate_x بر این اساس تغییر می کند.
void specialKeys (کلید int ، int x ، int y) {// پیکان راست - چرخش را تا 5 درجه افزایش دهید (کلید == GLUT_KEY_RIGHT) rotate_y += 5 ؛ // پیکان چپ - چرخش را تا 5 درجه دیگر کاهش دهید (کلید == GLUT_KEY_LEFT) rotate_y - = 5 ؛ در غیر این صورت (key == GLUT_KEY_UP) rotate_x += 5؛ در غیر این صورت (key == GLUT_KEY_DOWN) rotate_x -= 5؛ // درخواست بروز رسانی صفحه نمایش glutPostRedisplay ()؛ }
مرحله 2. glRotate () را اضافه کنید
آخرین بیانیه شما این است که گزاره ای را اضافه کنید که شیء شما را می چرخاند. به تابع display () برگردید و قبل از سمت FRONT ، این خطوط را اضافه کنید:
// بازنشانی تغییرات glLoadIdentity ()؛ // هنگامی که کاربر rotate_x و rotate_y glRotatef (rotate_x ، 1.0 ، 0.0 ، 0.0) را تغییر می دهد ، بچرخید. glRotatef (rotate_y ، 0.0 ، 1.0 ، 0.0) ؛ // سمت چند رنگ - جلو….
مرحله 3. دستورات زیر را اضافه کنید تا مکعب را در طول محور x 2 ، در امتداد محور y مقیاس دهید ، مکعب را 180 درجه در مورد محور y بچرخانید و مکعب را 0.1 در امتداد محور x ترجمه کنید
اطمینان حاصل کنید که این دستورات و دستورات قبلی glRotate () را به ترتیب صحیح ترتیب دهید. (اگر مطمئن نیستید ، این کار را در کد نهایی در پایان آموزش انجام دهید.)
// سایر تغییرات glTranslatef (0.1 ، 0.0 ، 0.0) ؛ glRotatef (180 ، 0.0 ، 1.0 ، 0.0) ؛ glScalef (2.0 ، 2.0 ، 0.0) ؛
مرحله 4. کد خود را کامپایل و اجرا کنید
با فرض اینکه از gcc به عنوان کامپایلر خود استفاده می کنید ، این دستورات را از ترمینال خود اجرا کرده و برنامه خود را کامپایل و آزمایش کنید.
در لینوکس: gcc cube.c -o cube -lglut -lGL./ mycube در مک: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube در Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
مرحله 5. کد کامل خود را بررسی کنید
باید اینجوری باشه:
// // فایل: mycube.c // نویسنده: Matt Daisley // ایجاد: 4/25/2012 // پروژه: کد منبع برای ساختن یک مکعب در OpenGL // توضیحات: یک پنجره OpenGL ایجاد می کند و یک مکعب سه بعدی ترسیم می کند/ / اینکه کاربر می تواند با استفاده از کلیدهای جهت دار بچرخد // // کنترل ها: پیکان چپ -چرخش به چپ // پیکان راست -چرخش به راست // پیکان بالا -چرخش به بالا // پیکان رو به پایین -چرخش به پایین // ------ ------------------------------------------------------ -- // شامل می شود // ------------------------------------------- --------------- #شامل #شامل #شامل #تعریف #GL_GLEXT_PROOTOTYPES #ifdef _APPLE_ #شامل #دیگر #شامل #endif // ------------- --------------------------------------------- // نمونه های اولیه عملکرد / / ----------------------------------------------------- --------- نمایش خالی ()؛ void specialKeys ()؛ // ---------------------------------------------------- ---------- // متغیرهای جهانی // ---------------------------------- ------------------------- دوبار rotate_y = 0 ؛ double rotate_x = 0؛ // ---------------------------------------------------- ---------- // نمایش () عملکرد تماس () ---------------------------------- --------------------------- نمایش خالی () {// پاک کردن صفحه و Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ؛ // بازنشانی تغییرات glLoadIdentity ()؛ // سایر تحولات // glTranslatef (0.1 ، 0.0 ، 0.0) ؛ // شامل نمی شود // glRotatef (180 ، 0.0 ، 1.0 ، 0.0) ؛ // شامل نمی شود // چرخش هنگام تغییر کاربر rotate_x و rotate_y glRotatef (rotate_x ، 1.0 ، 0.0 ، 0.0) ؛ glRotatef (rotate_y ، 0.0 ، 1.0 ، 0.0) ؛ // سایر تحولات // glScalef (2.0 ، 2.0 ، 0.0) ؛ // شامل نمی شود // سمت چند رنگ - FRONT glBegin (GL_POLYGON) ؛ glColor3f (1.0 ، 0.0 ، 0.0) ؛ glVertex3f (0.5 ، -0.5 ، -0.5) ؛ // P1 قرمز glColor3f است (0.0 ، 1.0 ، 0.0) ؛ glVertex3f (0.5 ، 0.5 ، -0.5) ؛ // P2 سبز glColor3f است (0.0 ، 0.0 ، 1.0) ؛ glVertex3f (-0.5 ، 0.5 ، -0.5) ؛ // P3 آبی glColor3f است (1.0 ، 0.0 ، 1.0) ؛ glVertex3f (-0.5 ، -0.5 ، -0.5) ؛ // P4 بنفش glEnd () است؛ // سمت سفید - BACK glBegin (GL_POLYGON) ؛ glColor3f (1.0 ، 1.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) ؛ glEnd ()؛ // طرف بنفش - RIGHT glBegin (GL_POLYGON) ؛ glColor3f (1.0 ، 0.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) ؛ glEnd ()؛ // سمت سبز - LEFT glBegin (GL_POLYGON) ؛ glColor3f (0.0 ، 1.0 ، 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) ؛ glEnd ()؛ // سمت آبی - TOP glBegin (GL_POLYGON) ؛ glColor3f (0.0 ، 0.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) ؛ glEnd ()؛ // سمت قرمز - BOTTOM glBegin (GL_POLYGON) ؛ glColor3f (1.0 ، 0.0 ، 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) ؛ glEnd ()؛ glFlush ()؛ glutSwapBuffers ()؛ } // --------------------------------------------------- ----------- // specialKeys () عملکرد تماس با ما // ------------------------------ ---------------------------- void specialKeys (کلید int ، int x ، int y) {// پیکان راست-افزایش چرخش 5 درجه if (key == GLUT_KEY_RIGHT) rotate_y += 5؛ // پیکان چپ - چرخش را تا 5 درجه دیگر کاهش دهید (کلید == GLUT_KEY_LEFT) rotate_y - = 5 ؛ در غیر این صورت (key == GLUT_KEY_UP) rotate_x += 5؛ در غیر این صورت (key == GLUT_KEY_DOWN) rotate_x -= 5؛ // درخواست بروز رسانی صفحه نمایش glutPostRedisplay ()؛ } // --------------------------------------------------- ----------- // تابع main () // ---------------------------------- --------------------------- int main (int argc، char* argv ) {// مقداردهی اولیه GLUT و پردازش پارامترهای کاربر glutInit (& argc، argv)؛ // درخواست پنجره رنگی بافر دوگانه با Z-buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) ؛ // ایجاد پنجره glutCreateWindow ("مکعب عالی") ؛ // فعال کردن آزمون عمق بافر Z glEnable (GL_DEPTH_TEST) ؛ // توابع فراخوانی glutDisplayFunc (نمایش) ؛ glutSpecialFunc (specialKeys) ؛ // گذراندن کنترل به GLUT برای رویدادها glutMainLoop ()؛ // بازگشت به سیستم عامل بازگشت 0؛ }