opengl در مجیدآنلاین

شروع موضوع توسط saalek110 ‏4 سپتامبر 2019 در انجمن منطق و الگوریتم برنامه‌نویسی

کلمات کلیدی:
  1. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    OpenGL چیست ؟
    به بیان کاملا ساده ...
    1-یک کتابخانه ی گرافیکی اپن سورس است ( open source graphic library )
    در واقع یک رابط برنامه نویسی کاربردی است (API )
    یا همان "رابط نرم افزاری برای سخت افزار گرافیکی" ( مانند DirectX )
    (مثلا شما انتظار کشیده شدن یک شکل 3 بعدی را دارید و این رابط این کار را برای شما به راحتی انجام می دهد !
    به این منظور که دیگر نیازی به برنامه نویسی سطح پایین و روشن کردن تک تک پیکسل ها نخواهید داشت .)
    یعنی شما یک زبان را انتخاب می کنید (مثلا ++c ) سپس یک محیط را انتخاب میکنید ( مثلا Visual) سپس یک رابط (در اینجا اپن جی ال ) .و حالا می توانید برنامه نویسی گرافیکی سه بعدی را شروع کند :shock:
    2-در همه جا قابل اجرا شدن است ::oops:
    کنسول های بازی
    سیستم های عامل ( ویندوز لینوکس ... )
    اپل، مک ...
    موبایل ها
    https://forum.majidonline.com/threads/opengl-%DA%86%DB%8C%D8%B3%D8%AA-%D8%9F.152232
     
    آخرین ویرایش: ‏7 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏4 سپتامبر 2019
  2. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    OpenGL چیست ؟
    مخفف OPEN Graphic Library هست که حاوی یه سری فایل های DLL هست که توی آنها یه سری توابع تعریف شده برای کارهای گرافیکی که در برنامه های 3بعدی یا گرافیکی از آنها استفاده می کنند .....
    OpenGL چیه ؟
     
    آخرین ویرایش: ‏7 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏4 سپتامبر 2019
    the_king از این پست تشکر کرده است.
  3. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    OpenGL چیست و GLUT چیست؟

    500-e1545614553584.jpg

    OpenGL مخفف عبارت Open Graphic Library است و همان طور که از نامش پیداست یک کتابخانه جهت دستیابی ساده به سخت افزار گرافیکی شماست.برای کاربران عادی نامOpenGL با نام بازی های سه بعدی گره خورده است. قبل از نوشتن OpenGL برنامه نویسان گرافیکی مجبور بودند که مستقیما برای سخت افزارهای گرافیکی کار کنند و برای سخت افزارها برنامه های اختصاصی بنویسند. اما با گسترش روز افزون تکنولوژی و سخت افزارهای مختلف این رویه ی برنامه نویسی کاربرد خود را از دست داد.
    چرا که برنامه نویسان برای انتقال یک برنامه ی ساده از یک سخت افزار به سخت افزار دیگر مجبور بودند ده ها ( بلکه هزاران ) خط کد را ویرایش و اصلاح کنند تا با سخت افزار موجود جواب بگیرند.

    حتی بعد از برطرف شدن مشکل با سیستم عامل های نسل جدید ، مشکل خود را به گونه ای دیگر نشان داد : « عدم توانایی حمل در سیستم های عامل مختلف ». بنابراین نیاز به وجود یک API واحد که بتواند قدرتمند ، قابل انتقال و سطح پایین باشد به شدت احساس می شود.
    OpenGL این نیازها را به طور کامل برطرف کرده و خواهد کرد.

    خب یه تعریفی کوچیکی از OpenGL کردیم و نیازی نمی بینم برم کل تاریخچشو زیر و رو کنم و چیزای کلی رو خدمتتون می گم.

    تاریخچه ای بر OpenGL
    OpenGL در دهه 1990 توسط شرکت Silicon Grapihcs متولد شد. اما کار استاندارد سازی و تکمیل آن توسط گروه ARB (OpenGL Architecture Review Board) انجام شد. این گروه متشکل از شرکت های بزرگی همچون مایکروسافت ،3DLabs ،SGI،ATI،Intel،IBM،Sun،NVIDIA،Dell و غیره بودند که البته مایکروسافت جهت تولید محصول انحصاری خود ( یعنی DirectX ) از سال 2003 این گروه را ترک کرد. نسخه ی اول OpenGL توسط شرکت SGI در سال 1992 منتشر شد. نسخه ی دوم آن نیز توسط شرکت 3DLabs توسعه داده شد. هم اکنون OpenGL در نسخه ی 4.5 به سر می برد.

    هدف اصلی توسعه OpenGL
    OpenGL در اصل برای دو هدف اصلی توسعه داده شده و می شود:

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

    این کتابخانه ها بر دو نوع اند:

    1. کتابخانه های مستقل از سکو
    2. کتابخانه های وابسته به سکو
    کتابخانه های مستقل از سکو همانند OpenGL قابلیت انتقال به هر سکویی که OpenGL به آن پورت شده باشد را دارند و دیگر نیازی به تغییر کدهایتان در آن ها ندارید. اما کتابخانه های وابسته به سکو در سیستم عامل های خاصی اجرا می شوند و در دیگر سیستم عامل ها کارایی ندارند. ( نیاز به تغییر عمده ی کد وجود دارد ) از جمله ی کتابخانه های مستقل از سکو می توان دو کتابخانه GLUT و SDL را نام برد که در این مقاله ها و آموزش ها بر روی GLUT تمرکز خواهیم کرد.

    از جمله ی کتابخانه های وابسته به سکو می توان به WGL برای ویندوز ، CGL برای Mac OS X و GLX برای لینوکس اشاره کرد. البته لازم به ذکر است این کتابخانه ها تنها استفاده از سیستم Windowing را فراهم می کنند و دیگر قابلیت ها مثل کنترل ورودی و خروجی یا صدا را پشتیبانی نمی کنند و برای اضافه کردن این قابلیت ها بایستی از زبان برنامه نویسی مورد استفاده و یا ویژگی های سیستم عامل خود اتفاده کنید. پس ملاحظه می فرمایید که استفاده از کتابخانه های مستقل از سکو ضمن اینکه وابستگی به میزبان ندارند ، همگی موارد نیاز برای نوشتن یک بازی رایانه ای را برایتان فراهم می آورند.

    کتابخانه ی GLUT
    در واقع جعبه ابزار OpenGL است. این کتابخانه تکمیل کننده ی کتابخانه ی GLU (OpenGL Utility Library) است که توابعی را ارائه می دهد که یک سطح بالاتر از سطح توابع اصلی OpenGL هستند. کتابخانه ی GLU معمولا به همراه OpenGL

    توزیع می شود چرا که کارهای اصلی که با OpenGL می توان انجام داد از قبیل : تبدیلت مختصات ، ایجاد texture ها ، ایجاد چهارضلعی ها ، تولید خطاهای OpenGL و غیره را شامل می شود. و در واقع برنامه نویسی OpenGL بدون GLU
    کار بسیار سخت و طاقت فرسایی خواهد بود. حال کاری که کتابخانه ی GLUT کسرده است (OpenGL Utility Toolkit) یک سطح بالتر از GLU را ارائه داده است. یعنی کار با اجزای سیستم عامل میزبان. کارهایی از قبیل کنترل پنجره ها ، کنترل ورودی و … را می توان با این کتابخانه انجام داد. سه کتابخانه ی OpenGL، GLU و GLUT یک پکیج کامل و هماهنگ را جهت ایجاد برنامه های گرافیکی بسیار قدرتمند فراهم می سازند.

    منبع: فولکده
    https://fullkade.com/1395/02/opengl-%DA%86%DB%8C%D8%B3%D8%AA-glut-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F
     
    آخرین ویرایش: ‏7 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏4 سپتامبر 2019
  4. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    ساخت اولین برنامه و معرفی توابع آن
    اول خط به خط کدها توضیح داده می شود. در انتها برنامه کامل.
    PHP:
    void glutInit(int *argc,char **argv)
    این تابع برای معرفی کتابخونه ی GLUT استفاده میشه و باید قبل از تمام توابع glut از آن استفاده بشه در واقع کارش Initial کردنه GLUT هست.
    PHP:
    int glutCreateWindow(char *name)
    یک پنجره ی openGL میسازه برای استفاده های بعدی.مقدار بازگشتی یک int (که فقط هنگامی به کار میره که بخواهیم از چندین پنجره استفاده کنیم(که ما فعلا کاری بهش نداریم. سایز این پنجره در حالت پیش فرض 300*300 که با استفاده از تابع glutInitWindowSize() میتونیم اندازش عوض کنیم.
    PHP:
    void glutDisplayFunc(void (*func) (void))
    این تابع صفحه ی OpenGl رو refresh میکنه.همونطور که میبینید پارامتر این تابع خودش یک تابع هست.به این نوع توابع callback میگن.ما در OpenGL از این نوع توابع استفاده میکنیم تا بتونیم توابعی رو با کاربرد مورد نظر خودمون بسازیم و استفاده کنیم چون همونطور که میبینین تمام توابع OpenGL از پیش تعریف شدن و تنها راه استفاده از توابع دست نویس خودمون استفاده از همین callback هاست.
    PHP:
    void glClear(GLbitfield mask)
    این تابع یک یا چند بافر از OpenGL رو پاک میکنه که با mask مشخص شدن.ما در این آموزش ها فقط از Frame buffer استفاده میکنیم که کارش نگه داشتن پیکسل هاییه که در پنجرمون کپی میشن.
    ماکرو frame buffer در روبرو مشخص شده:
    GL_COLOR_BUFFER_BIT
    این بافر در حالت پیش فرض با سیاه پر شده برای همین در حالتی که هیچی تو صفحه نداریم صفحه سیاه.
    شما میتونین برای عوض کردن رنگ buffer از تابع glClearColor() استفاده کنین.
    PHP:
    void glFlush(void)
    این تابع باعث میشه که محتویات هر کدوم از بافر های داخلی flush (تراز) بشن.
    اگر ما این تابع رو فراخوانی نکنیم در پایان تابع Display معلوم نیست که چه تصویری رو نمایش بده و این برای یک برنامه ی Real-time (بی درنگ) اصلا جالب نیست.
    یک برنامه ی Real-time برنامه ایه که خودش همیشه در حال انجام یک کار خاص هست تا موقعی که ما بهش یک دستور دیگه رو بده.مثلا یک برنامه ی OpenGL همیشه در حال رندر کردن یک صفحه هست تا ما بتونیم همیشه تصویر داشته باشیم.
    PHP:
    void glutMainLoop(void)
    این تابع یک حلقه ایجاد میکنه و تا پایان برنامه اجرا میشه .
    در این حلقه هر بار GLUT چک میکنه که اگر تغییری ایجاد شده آن را پیدا کند و تابع Callback مناسب رو اجرا کنه.
    جریان این حلقه همون جریان Real-time که در بالا اشاره شد.
    کل کد:
    PHP:

    /* ex2.c */
    #include <GL/glut.h>
    #include <stdio.h>
    void display (void)
    {
    /* Called when OpenGL needs to update the display */
       glClear (GL_COLOR_BUFFER_BIT); /* Clear the window */
       glFlush(); /* Force update of screen */
    }
    void keyboard (unsigned char key, int x, int y)
    {
    /* Called when a key is pressed */
       if (key == 27) exit (0); /* 27 is the Escape key */
    else printf ("You pressed %c\n", key);
    }
    int main(int argc, char **argv)
    {
        glutInit (&argc, argv); /* Initialise OpenGL */
        glutCreateWindow ("ex2"); /* Create the window */
        glutDisplayFunc (display); /* Register the "display" function */
        glutKeyboardFunc (keyboard); /* Register the "keyboard" function */
        glutMainLoop (); /* Enter the OpenGL main loop */
        return 0;
    }
    /*end of ex2.c */
     
    برنامه بالا کاری انجام نمی دهد چون در تابع display آن شکلی رسم نشده.

    a3.jpg
     
    آخرین ویرایش: ‏7 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏6 سپتامبر 2019
  5. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    شرح بقیه برنامه:
    PHP:
    void glutKeyboardFunc(void(*func)(unsigned char key,int x,int y)
    همون طور که مشاهده میکنین آرگومان ورودی این تابع خودش یک تابع هست که خود اون تابع سه پارامتر میگیره.
    unsigned char key:
    این متغیر،کد اسکی کاراکتر فشار داده شده ی روی keyboard رو تو خودش نگه میداره.(این تابع برای کاراکترهایی استفاده میشه که یک قسمتی هستند ولی برای بعضی کلید های keyboard مثل F ها و کلید های پیمایش باید از تابع glutSpecialFunc استفاده بشه)
    int x,y: مختصات محلی رو که اشاره گر موس روشه رو نگه میدارن که فعلا به اونا کار نداریم.
    ما میتونیم هر تابعی که آرگومان هاش به صورت آرگومانهای ورودی تابع glutKeyboardFunc باشه رو تعریف کنیم و بهش بگیم موقع فشار دادن فلان کلید ، فلان کار رو بکن.
    در برنامه ی بالا ما این کار رو به وسیله ی تابع
    PHP:
    void keyboard (unsigned char key, int x, int y)
    انجام دادیم.
    منبع:
    http://forum.codecorona.com/showthread.php?tid=372&page=1
     
    آخرین ویرایش: ‏7 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏6 سپتامبر 2019
  6. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113

    پیوست ها:

    آخرین ویرایش: ‏7 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏6 سپتامبر 2019
  7. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    محیط کار می تواند code::blocks یا Dev c باشد
    به کد زیر نگاه کنید: ازکتاب پست قبل کپی کردم...
    HTML:
    int main(int argc, char **argv)
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowSize(Width, Height);
    glutCreateWindow("Hello OpenGL World");
    glutDisplayFunc(display);
    glutMainLoop();
    }
    در این خطش:
    HTML:
    glutDisplayFunc(display);
    تابع نمایش را معرفی کرده.
    می بینید برنامه main در زبان سی است.
    جندتا تابع معرفی می شود.مثل تابع کیبورد و یا تابع ماوس وچند تا دیگه .به همین شکلی که تابع display اینجا معرفی شده. این طوری:
    PHP:
     
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutIdleFunc(idle);
        glutSpecialFunc(processSpecialKeys);
        glutKeyboardFunc(keyboard);
       glutMouseFunc( mouse);
     
    در هر کدام از این توابع کدهای خاص خودش باید قرار بگیرد.

    در اینجا تابع display معرفی شده که با همین نام display باید تابعی در اختیار main باشد.
    مثلا این طور:
    PHP:
    27 void display(void)
    28 {
    29 glClear(GL_COLOR_BUFFER_BIT);
    30 DrawCircle(0.8, 100);
    31 glColor3f(1, 1, 0);
    32 glBegin(GL_QUADS);
    33 glVertex2f(-0.2, 0.2);
    34 glVertex2f(-0.2, -0.2);
    35 glVertex2f(0.2, -0.2);
    36 glVertex2f(0.2, 0.2);
    37 glEnd();
    38 glutSwapBuffers();
    39 }
    سواپ بافر یعنی جابجایی بافرها. دو بافر داریم در بافر زیری می کشیم و بعد با بافر رویی جایش را عوض می کنیم. بافر مقداری حافظه است.
    بین begin و end مختصات یک شکل داده شده. تابع DrawCicle در کتاب بالا بود ولی من اینجا کپی نکردم.
    پس یا در خود تابع display می توانیم رسم کنیم یا توابع رسم را فرابخوانیم.

    بقیه کدهای برنامه main برای رسم پنجره بود و خط آخر هم حلقه برنامه را ایجاد می کند. قسمت نمایش یعنی display مدام اجرا می شود. یک printf بنویسید متوجه می شوید.

    از کدهای این کتاب یا سورسهای دیگر استفاده کنید.
    کتاب بالا گویا دو برنامه کامل دارد ولی رسم اشکال مختلف را گفته. فکر می کنم برای شروع خوبه.
    شما قسمت main و تابع display را شکل بده و بعد اشکال مختلف را تمرین کن.
     
    آخرین ویرایش: ‏6 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏6 سپتامبر 2019
  8. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    می توانید متحرک سازی هم بکنید. یک متغیر گلوبال بالای برنامه بسازید فلاوت باشه.float . داخل display به آن بیافزایید.
    PHP:
    x1=x1+0.2;
    برای جابجایی اشکال از glTranslatef استفاده میشه:
    PHP:
    glTranslatef(0.0f+x1 ,0.0f, 0.0f);
    ...
    ...
    ...
    ...

    glTranslatef(0.0f-x1 ,0.0f, 0.0f);
    من دستور سه بعدی را نوشتم.که شامل x و y و z است. در دو بعدی فقط x و y است.
    شکلی که قرار است حرکت کند وسط دو دستور قرار می گیرد. مثل دستور رسم یک کره یا استوانه. می توانید چندین شکل بین دو خط بالا قرار دهید تا همه با هم حرکت کنند. مثلا اجزای یک اتومبیل.
    اگر خط آخر را ننویسید بقیه اشکال هم حرکت می کنند. خط آخر جابجایی را خاتمه می دهد تا به آشکال بعدی سرایت نکند.
    برای چرخش اشکال از glRotated استفاده کنید:
    PHP:
    glRotated(90, 0.0, 1.0, 0.0);
    ...
    ...

    glRotated(-90, 0.0, 1.0, 0.0);
    باز هم کد انتهایی منفی همان مقدار کد ابتدایی را گرفته. اون صفر و یک های بعدی محور چرخش را معرفی می کند. مثلا حول محور x یا حول محور y یا z.
    اگر خواستید محور چرخش عوض بشه یکی از اون صفرها باید بشه یک و اون یک بشود صفر.
    مثلا در کد زیر:
    PHP:
                                       glRotated(rotation, 1.0, 0.0, 0.0);
                                       glutSolidCone(0.5, 1.0, 50, 50);  
                                        glRotated(-rotation, 1.0, 0.0, 0.0);
    من با تغییر مداوم متغیر rotation باعث چرخش مداوم این شکل شده ام.
     
    آخرین ویرایش: ‏6 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏6 سپتامبر 2019
  9. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    فعلا این توضیحات را نوشتم. بعدا انشا الله کامل تر می نویسم.
     
    نوشته شده توسط saalek110 در ‏6 سپتامبر 2019
  10. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    بروید لینک زیر:
    Nate Robins - OpenGL - Tutors
    لینک دومی را دانلود کنید. یعنی
    Source package + Windows executables (tutors-win32.zip 1.24MB)
    داخلش یک سری فایل exe است. اون فایلها را اجرا کنید. بعد با ماوس روی صفحه بکشید. می توانید متغیرها را با ماوس تغییر دهید.
    مثلا در شکل زیر روی lookat کار می کند که همان دوربین است.

    s2.jpg

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

    یا بحث های ساده تر مثل رنگ. در شکل زیر من با یک کردن عدد اول و صفر کردن دو عدد بعدی رنگ قرمز ساخته ام:

    s6.jpg

    و رنگ زرد میشه: یک-یک-صفر
    و سبز میشه : صفر-یک-صفر.
    و آبی میشه: صفر-صفر-یک.
     

    پیوست ها:

    آخرین ویرایش: ‏12 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏6 سپتامبر 2019
  11. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    بعد مدتی تمرین اگر سورس کاملتری خواستید سورس آدم برفی ها را ببینید:
    http://www.lighthouse3d.com/tutorials/glut-tutorial/keyboard-example-moving-around-the-world
    اگر مشکل توابع ریاضی سینوس و کسینوس sin & cos داشت این را اضافه کنید:
    PHP:
    #include <math.h>
    این برنامه مجهز به دوربین است. می توانید با کلیدهای جهت میان آدم برفی ها حرکت کنید.

    a3.jpg

    همچنین با تابع کیبورد آشنا می شوید.
    و می بینید چطور از متغیر گلوبال در برنامه استفاده کرده.

    بعدا می توانید به جای آدم برفی ها اشکال سه بعدی خودتان را قرار دهید.
    گام بعد تکسچردهی و نورپردازی محیط است.
     
    نوشته شده توسط saalek110 در ‏6 سپتامبر 2019
    the_king از این پست تشکر کرده است.
  12. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    امیدوارم تا اینجا مورد استفاده شما قرار گرفته باشد.
     
    آخرین ویرایش: ‏6 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏6 سپتامبر 2019
  13. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    بحث ساخت تکسچر هنوز گفته نشده ولی یک نکته در مورد تکسچر دادن به احجام:

    در opengl اشکال بدون تکسچر اسامی به این شکل دارند glutSolidTorus
    یعنی کلمه Solid دارد.
    ولی اشکال تکسچردار این طوری هستند:
    PHP:
     gluCylinder(quadricObj,...,...,...,..,..);
    کد بالا برای یک استوانه تکسچردار است.کلمه quadricObj قبل این خط باید تعریف بشود. با دانستن اسم شکل یعنی gluCylinder می توانید سرچ کنید و کد کامل را پیدا کنید.
     
    نوشته شده توسط saalek110 در ‏7 سپتامبر 2019
    the_king از این پست تشکر کرده است.
  14. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    تمرین:
    یک برنامه ساده: رسم مثلث.
    PHP:
    /*

    * triangle.c -- A simple example of OpenGL and GLUT.
    */


    #include <GL/glut.h>

    void displayCB(void)        /* function called whenever redisplay needed */
    {
      glClear(GL_COLOR_BUFFER_BIT);        /* clear the display */
      glColor3f(1.0, 1.0, 1.0);        /* set current color to white */
      glBegin(GL_POLYGON);            /* draw filled triangle */
      glVertex2i(200,125);            /* specify each vertex of triangle */
      glVertex2i(100,375);
      glVertex2i(300,375);
      glEnd();                /* OpenGL draws the filled triangle */
      glFlush();                /* Complete any pending operations */
    }

    void keyCB(unsigned char key, int x, int y)    /* called on key press */
    {
      if( key == 'q' ) exit(0);
    }


    int main(int argc, char *argv[])
    {
      int win;

      glutInit(&argc, argv);        /* initialize GLUT system */

      glutInitDisplayMode(GLUT_RGB);
      glutInitWindowSize(400,500);        /* width=400pixels height=500pixels */
      win = glutCreateWindow("Triangle");    /* create window */

      /* from this point on the current window is win */

      glClearColor(0.0,0.0,0.0,0.0);    /* set background to black */
      gluOrtho2D(0,400,0,500);        /* how object is mapped to window */
      glutDisplayFunc(displayCB);        /* set window's display callback */
      glutKeyboardFunc(keyCB);        /* set window's key callback */

      glutMainLoop();            /* start processing events... */

      /* execution never reaches this point */

      return 0;
    }
    f44.jpg

    شرح: در تابع display می بینیم با دادن x و y 3 نقطه آن مثلث تعریف شده.
    در تابع کیبورد یعنی keyCB دکمه q برای خروج از برنامه تعریف شده.
    بقیه قسمتها را قبلا شرح دادیم.
     
    آخرین ویرایش: ‏12 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏7 سپتامبر 2019
  15. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    PHP:
    /* ex4.c */
    #include <GL/glut.h>
    void display (void)
    {
    /* Called when OpenGL needs to update the display */
       glClear (GL_COLOR_BUFFER_BIT); /* Clear the window */
       glLoadIdentity ();
       gluLookAt (0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
       glBegin (GL_LINE_LOOP); /* Draw a triangle */
          glVertex3f(-0.3, -0.3, 0.0);
          glVertex3f(0.0, 0.3, 0.0);
          glVertex3f(0.3, -0.3, 0.0);
       glEnd();
       glFlush(); /* Force update of screen */
    }
    void keyboard (unsigned char key, int x, int y)
    {
    /* Called when a key is pressed */
       if (key == 27) exit (0); /* 27 is the Escape key */
    }
    void reshape (int width, int height)
    { /* Called when the window is created, moved or resized */
         glViewport (0, 0, (GLsizei) width, (GLsizei) height);
         glMatrixMode (GL_PROJECTION); /* Select the projection matrix */
         glLoadIdentity (); /* Initialise it */
         glOrtho(-1.0,1.0, -1.0,1.0, -1.0,1.0); /* The unit cube */
         glMatrixMode (GL_MODELVIEW); /* Select the modelview matrix */
    }
    int main(int argc, char **argv)
    {
        glutInit (&argc, argv); /* Initialise OpenGL */
        glutInitWindowSize (500, 500); /* Set the window size */
        glutInitWindowPosition (100, 100); /* Set the window position */
        glutCreateWindow ("ex4"); /* Create the window */
        glutDisplayFunc (display); /* Register the "display" function */
        glutReshapeFunc (reshape); /* Register the "reshape" function */
        glutKeyboardFunc (keyboard); /* Register the "keyboard" function */
        glutMainLoop (); /* Enter the OpenGL main loop */
        return 0;
    }
    /* end of ex4.c */
    f55.jpg

    دو مثلثی که در دو پست رسم شده با تابع های مختلف رسم شده اند
    glBegin(GL_POLYGON) و glBegin (GL_LINE_LOOP) که یکی توپر شده و دیگری تعدادی خط است.
    از gluLookAt هم استفاده شده که در پست بعد شرح می دهیم.

    منبع
     
    آخرین ویرایش: ‏12 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏7 سپتامبر 2019
  16. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    دوربین:

    PHP:
    void gluLookAt( , , , , , , , , );
    این تابع برای تنظیم محل دید شما یا به اصطلاح camera صفحه هست.
    این تابع 9 تا پارامتر داره:
    3 تای اول X ,Y ,Z محل دوربین شماست.
    3 تای دوم محلی که دوربین شما به اون نگاه میکنه.
    3 تای سوم زاویه ی بالای دوربین شماست.

     
    آخرین ویرایش: ‏7 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏7 سپتامبر 2019
  17. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    شرح مهم. کد زیر را ببینید:
    PHP:
    void glVertex2f ( GLfloat x,GLfloat y );
    این تابع مختصات نقطه ی ورودی رو از شما میگیره و در اونجا یک نقطه میذاره.اگر به نام این تابع توجه کنین میتونین بفهمین که حرف آخر تابع ( f ) مشخص کننده ی نوع عدد وردی شما و عدد 2 که قبل از این حرف اومده نشونه ی تعداد بعدهای شماست.
    مثلا شما اگر به جای 2 ،عدد 3 بذارین ورودی های شما 3 تا میشه یعنی در 3 بعد و اگر به جای حرف f از حرف d استفاده کنین ورودی شما double میشه.
    اگر چند تا از این توابع رو کنار هم بذارین و با توجه به وردی تابع glBegin میتونین اشکال زیادی رو بسارین.

    اشکال مختلف آماده:
    PHP:
    /* GLUT pre-built models sub-API */
    GLUTAPI void GLUTAPIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
    GLUTAPI void GLUTAPIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
    GLUTAPI void GLUTAPIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
    GLUTAPI void GLUTAPIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
    GLUTAPI void GLUTAPIENTRY glutWireCube(GLdouble size);
    GLUTAPI void GLUTAPIENTRY glutSolidCube(GLdouble size);
    GLUTAPI void GLUTAPIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
    GLUTAPI void GLUTAPIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
    GLUTAPI void GLUTAPIENTRY glutWireDodecahedron(void);
    GLUTAPI void GLUTAPIENTRY glutSolidDodecahedron(void);
    GLUTAPI void GLUTAPIENTRY glutWireTeapot(GLdouble size);
    GLUTAPI void GLUTAPIENTRY glutSolidTeapot(GLdouble size);
    GLUTAPI void GLUTAPIENTRY glutWireOctahedron(void);
    GLUTAPI void GLUTAPIENTRY glutSolidOctahedron(void);
    GLUTAPI void GLUTAPIENTRY glutWireTetrahedron(void);
    GLUTAPI void GLUTAPIENTRY glutSolidTetrahedron(void);
    GLUTAPI void GLUTAPIENTRY glutWireIcosahedron(void);
    GLUTAPI void GLUTAPIENTRY glutSolidIcosahedron(void);



    images (1).jpg
     
    آخرین ویرایش: ‏7 سپتامبر 2019
    نوشته شده توسط saalek110 در ‏7 سپتامبر 2019
  18. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    images (2).jpg
     
    نوشته شده توسط saalek110 در ‏7 سپتامبر 2019
  19. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    images (3).jpg
     
    نوشته شده توسط saalek110 در ‏7 سپتامبر 2019
  20. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    flowers.jpg
     
    نوشته شده توسط saalek110 در ‏7 سپتامبر 2019

به اشتراک بگذارید