کلاغ عزیز . این همون عدد پی که باید اول برنامه تعریفش کنی . بعد include ها
#define M_PI 3.141592653589
Printable View
کلاغ عزیز . این همون عدد پی که باید اول برنامه تعریفش کنی . بعد include ها
#define M_PI 3.141592653589
آقا خیلی ممنمون . خدایی حال میدی .
حاجی خیلی ممنون ولی من مشکلم حل نشد ... به M-Pi گیر میده ... ولی بازم دمت گرم
یه خورده تو فرومای C++ گشتم حل شد ... وافعا ممنون ... :تشویق:
اینم توضیح تابع دوم
#include <GL/glut.h> // برای مدیریت پنجره ورودی ها و خروجی ها که سر فایل های هسته اپن جی ال نیز در آن تعریف شده است
float i=0; // متغیری کلی برای ایجاد حالت انیمیشن
void Display() // تابع اصلی نمایش
{
glClear(GL_COLOR_BUFFER_BIT); //clears display window پاک کردن پنجره نمایش در هر بار فراخوانی تابع اصلی نمایش
glColor3f(1.0, 0.0, 1.0); // تعیین رنگ پیکسل
GLUquadricObj *circle = gluNewQuadric (); // ایجاد یک پوینتر برای شی از معادله درجه 2
gluQuadricDrawStyle (circle, GLU_SILHOUETTE); //تعیین استیل تابع درجه دو از نوع خطی باعث رسم تابع در جه 2 به صورت مجموعه ایی از خطهای اطراف آن می شود
gluDisk (circle,0,0.8,50,1); // این تابع برای رسم دایره با استیل تعریف شده 50 تکه ایی به شعاع 0.8 می شود
gluDeleteQuadric(circle); // حذف اشاره گر استیل
glPushMatrix(); // برای اینکه روی یک قسمت خاص تغییری ایجاد کنیم از این تابع استفاده می کنیم
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // این دو خط برای نرم کردن گوشه های پیکسل هستند
i+=0.04; // افزایش آی برای ایجاد حالت چرخش
glRotatef(i,0,0,0.1); // چرخش دادن پیکسل به اندازه 0.1 آی
glPointSize(10.0); // تعیین اندازه پیکسل
glColor3f(0.0, 1.0, 1.0);
glBegin(GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند GL_POINTS با
glVertex2f(0.25, 0.75); //تعیین مختصات نقطه به صورت ثابت
glEnd(); // پایان ترسیم نقطه
glPopMatrix(); // پایان قسمتی که تغییرات باید روی آن اعمال شود
glutSwapBuffers(); // این تابع جای بافر ها را برای نمایش بدون پرش یا فلیکر عوض می کند
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("Circle - 01");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutMainLoop();
return 0;
}
دستت درد نکنه . کلاغ مشکلت چی بود ؟
سلام دوستان.
اول از امین آقا به خاطر فروم پر باری که را انداخته تشکر می کنم.
و همچنین از دوستان دیگه که این همه علاقه از خودشون نشون میدن.
میخواستم چند تا تمرین گرافیک برامون قرار بدین تا بیشتر با برنامه نویسی opengl آشنا شیم.
در ضمن از ذوک و کلاغ هم تشکر میکنم.
من والا خودم مثل شما تازه کارم اما میشه با همین برنامه مثال های زیادی ایجاد کرد مثلا
1- برنامه ایی بنویسید که در آن 2 دایره کوچک روی محیط یک دایره بزرگتر در خلاف جهت همدیگر حرکت کنند.
2- برنامه ایی بنویسید که با فشردن کلید up صفحه کلید سرعت چرخش دایره های برنامه مثال قبل را زاید و با کلید down سرعت آنرا کم کند.
3- برنامه ایی بنویسید که در آن یک دایره رو محیط دایره دیگر گردش کرده و این مجموعه نیز دور یک دایره بزرگ تر حرکت کنند.
واقعا از تلاش های دوستان امین ، ذوووووووک و موه موم تشکر دارم ... واقعا تلاش دوستان برای یادگیری جای تقدیر داره خدایی ...
به امید موفقیت تک تکتون :چشمک:
من اولیو نوشتم ... البته مطمئنا آماتور هستش ... :لبخند:
#include <GL/glut.h>
float i=0;
float j=0;
void Display()
{
glClear(GL_COLOR_BUFFER_BIT); //clears display window
glColor3f(0.0, 0.0, 0.0);
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_SILHOUETTE);
gluDisk (circle,0,0.8,5000,1);
gluDeleteQuadric(circle);
glPushMatrix();
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
i+=0.1;
glRotatef(i,0,0,0.1);
glPointSize(8.0);
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_POINTS);
glVertex2f(0.25, 0.75);
glEnd();
glPopMatrix();
glPushMatrix();
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
j-=1;
glRotatef(j,0,0,0.1);
glPointSize(10.0);
glColor3f(1.0, 0.0, 1.0);
glBegin(GL_POINTS);
glVertex2f(0.25, 0.75);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("mS Circle");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutMainLoop();
return 0;
}
آره دیگه من تقلب کردم سریع نوشتم ... دادا جون فکر می کنم باید مثل C# از KeyEventArgs استفاده کنیم ولی نمی دونم تو C++ چطوریه ...
من در چند پست قبلی کیبورد را توضیح دادم یک نگاهی بندازید باید از تابع کلید های خاص استفاده کنیم...
داداشی یه سوال ... میشه بگی چطوری کدهاو با اون شکل تو پست های خودت میاری ؟ یاد مام بدی ممنون می شیم ...:گریه:
برای کار با کیبرد این پست را ببینید
https://barnamenevis.org/showpo...7&postcount=16
برای نوشتن کد به این صورت کدتون رو بیت تگ ها
[S0URCE="cpp"][/S0URCE]
قرار بدید
من خیلی تلاش کردم ولی جواب نداد ... داداشی میشه بگی چطوری باید ارتباط بین تابع keyboard و display رو برقرار کنیم ؟
ببین این یک برنامه است که دایره بوسیله کلید های up و down روی محیط دایره حرکت می کنه......
#include <GL/glut.h>
float i=0;
void special( int key, int x, int y)
{
switch(key){
case GLUT_KEY_UP:
i+=1;
break;
case GLUT_KEY_DOWN:
i-=1;
break;
}
}
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_SILHOUETTE);
gluDisk (circle,0,0.8,5000,1);
gluDeleteQuadric(circle);
glPushMatrix();
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glRotatef(i,0,0,0.1);
glPointSize(10.0);
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_POINTS);
glVertex2f(0.25, 0.75);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("Circle key");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutSpecialFunc(special);
glutMainLoop();
return 0;
}
#include <GL/glut.h> // برای مدیریت پنجره ورودی ها و خروجی ها که سر فایل های هسته اپن جی ال نیز در آن تعریف شده است
float i=0;
float j=0; // متغیری کلی برای ایجاد حالت انیمیشن
void special( int key, int x, int y)
{
switch(key){
case GLUT_KEY_UP:
i+=10;
j-=10;
break;
case GLUT_KEY_DOWN:
i+=0.1;
j-=0.1;
break;
}
}
void Display() // تابع اصلی نمایش
{
glClear(GL_COLOR_BUFFER_BIT); //clears display window پاک کردن پنجره نمایش در هر بار فراخوانی تابع اصلی نمایش
glColor3f(0.0, 0.0, 0.0); // تعیین رنگ پیکسل
GLUquadricObj *circle = gluNewQuadric (); // ایجاد یک پوینتر برای شی از معادله درجه 2
gluQuadricDrawStyle (circle, GLU_SILHOUETTE); //تعیین استیل تابع درجه دو از نوع خطی باعث رسم تابع در جه 2 به صورت مجموعه ایی از خطهای اطراف آن می شود
gluDisk (circle,0,0.8,5000,1); // این تابع برای رسم دایره با استیل تعریف شده 5000 تکه ایی به شعاع 0.8 می شود
gluDeleteQuadric(circle); // حذف اشاره گر استیل
glPushMatrix(); // برای اینکه روی یک قسمت خاص تغییری ایجاد کنیم از این تابع استفاده می کنیم
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // این دو خط برای نرم کردن گوشه های پیکسل هستند
i+=0.5; // افزایش آی برای ایجاد حالت چرخش
glRotatef(i,0,0,0.1); // چرخش دادن پیکسل به اندازه 0.1 آی
glPointSize(8.0); // تعیین اندازه پیکسل
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند GL_POINTS با
glVertex2f(0.25, 0.75); //تعیین مختصات نقطه به صورت ثابت
glEnd(); // پایان ترسیم نقطه
glPopMatrix(); // پایان قسمتی که تغییرات باید روی آن اعمال شود
glPushMatrix(); // برای اینکه روی یک قسمت خاص تغییری ایجاد کنیم از این تابع استفاده می کنیم
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // این دو خط برای نرم کردن گوشه های پیکسل هستند
j-=0.5; // کاهش جی برای ایجاد حالت چرخش
glRotatef(j,0,0,0.1); // چرخش دادن پیکسل به اندازه 0.1 جی
glPointSize(10.0); // تعیین اندازه پیکسل
glColor3f(1.0, 0.0, 1.0);
glBegin(GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند GL_POINTS با
glVertex2f(0.25, 0.75); //تعیین مختصات نقطه به صورت ثابت
glEnd(); // پایان ترسیم نقطه
glPopMatrix(); // پایان قسمتی که تغییرات باید روی آن اعمال شود
glutSwapBuffers(); // این تابع جای بافر ها را برای نمایش بدون پرش یا فلیکر عوض می کند
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("mS Circle");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutSpecialFunc(special);
glutMainLoop();
return 0;
}
داداشی اینو نوشتم وقتی keyup میزنی زیاد میشه ولی وقتی keydown میزنی کم نمیشه ... به نظرتون مشکل از کجاست ؟
این راهش نیست عزیز
باید یک متغیر سوم تعریف کنی....
در ضمن در کدی که شما نوشتی همیشه به مقدار i اضافه میشه در هر دو حالت....
درستش کردم ... کافیه اینو بنویسیم تو بالایی ...
void special( int key, int x, int y)
{
switch(key)
{
case GLUT_KEY_UP:
i+=10;
j-=10;
break;
case GLUT_KEY_DOWN:
i-=1;
j+=1;
break;
}
}
در واقع به جای i+=0.1 بنوسیم i-=1 تا یه مقداری از i کم شه ... همین ... برای j هم همینطور ...
برای من که درست کار نمی کنه !!!!!!!!!!!!!!!!!!!!!؟
برا من کار کرد ... فایل اجرایی رو می ذارم ...
خیلی باحالی پسر ...:تشویق:
منظورم این بود که جواب سوال این نیست یعنی یک دایره ثابت وجود داره شما وقتی کلید up رو فشار می دی شروع به حرکت کنه و هرچقدر بیشتر کلید رو بگیری بیشتر سرعت می گیرهحالا باید کلید down رو وقتی فشار می دیم سرعتش رو کم کنه تا جایی که بایسته و دوباره بر عکس حرکت کنه؟
خب داداشی برای ان کار میشه به جای i+=1 از i+=i استفاده کرد که بتونیم به گلوله شتاب بدیم اما اینم نمیشه کنترل کرد ... خیلی سریع پیشرفت می کنه و بعد از چند ثانیه دیگه نمیشه دیدش ... پس من با i+=i/100 به گلوله هل شتاب دادم ... ببین داداشی منظورت اینه ... فایل اجرایی رو گذاشتم ...
ببین این راهش نیست تو پست قبلی گفتم یک متغیر دیگه کم داره....
ای خدا ... داداشی چیستان شدا ... میشه خودت رو کنی ببینیم چیه ... مرسی :گریه:
ببین اینقدر سخت نیست که فکر می کنی
#include <GL/glut.h> // برای مدیریت پنجره ورودی ها و خروجی ها که سر فایل های هسته اپن جی ال نیز در آن تعریف شده است
GLfloat m=0.01,i=0.0; // متغیری کلی برای ایجاد حالت انیمیشن
void special( int key, int x, int y)
{
switch(key)
{
case GLUT_KEY_UP:
m+=0.01;
break;
case GLUT_KEY_DOWN:
m-=0.01;
break;
}
}
void Display() // تابع اصلی نمایش
{
glClear(GL_COLOR_BUFFER_BIT); //clears display window پاک کردن پنجره نمایش در هر بار فراخوانی تابع اصلی نمایش
glColor3f(0.0, 0.0, 0.0); // تعیین رنگ پیکسل
GLUquadricObj *circle = gluNewQuadric (); // ایجاد یک پوینتر برای شی از معادله درجه 2
gluQuadricDrawStyle (circle, GLU_SILHOUETTE); //تعیین استیل تابع درجه دو از نوع خطی باعث رسم تابع در جه 2 به صورت مجموعه ایی از خطهای اطراف آن می شود
gluDisk (circle,0,0.8,5000,1); // این تابع برای رسم دایره با استیل تعریف شده 5000 تکه ایی به شعاع 0.8 می شود
gluDeleteQuadric(circle); // حذف اشاره گر استیل
glPushMatrix(); // برای اینکه روی یک قسمت خاص تغییری ایجاد کنیم از این تابع استفاده می کنیم
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // این دو خط برای نرم کردن گوشه های پیکسل هستند
i+=m; // افزایش آی برای ایجاد حالت چرخش
glRotatef(i,0,0,0.1); // چرخش دادن پیکسل به اندازه 0.1 آی
glPointSize(8.0); // تعیین اندازه پیکسل
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند GL_POINTS با
glVertex2f(0.25, 0.75); //تعیین مختصات نقطه به صورت ثابت
glEnd(); // پایان ترسیم نقطه
glPopMatrix(); // پایان قسمتی که تغییرات باید روی آن اعمال شود
glPushMatrix(); // برای اینکه روی یک قسمت خاص تغییری ایجاد کنیم از این تابع استفاده می کنیم
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // این دو خط برای نرم کردن گوشه های پیکسل هستند
glRotatef(-i,0,0,0.1); // چرخش دادن پیکسل به اندازه 0.1 جی
glPointSize(10.0); // تعیین اندازه پیکسل
glColor3f(1.0, 0.0, 1.0);
glBegin(GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند GL_POINTS با
glVertex2f(0.25, 0.75); //تعیین مختصات نقطه به صورت ثابت
glEnd(); // پایان ترسیم نقطه
glPopMatrix(); // پایان قسمتی که تغییرات باید روی آن اعمال شود
glutSwapBuffers(); // این تابع جای بافر ها را برای نمایش بدون پرش یا فلیکر عوض می کند
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("mS Circle");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutSpecialFunc(special);
glutMainLoop();
return 0;
}
آهان ... ایول ... کلیت کارو توضیح میدین ؟ منظور این متغیرا چطوری کار میکنن ؟ چطوری پر میشن ؟ چطوری به هم مربوط هستن ؟
در ضمن داداشی سومیم راهنمایی کن تا شب بنویسیم بره پی کارش ... راهنمایی تپلا ... من خیلی اونو علاقه دارم بنویسم ... :متفکر::متفکر::متفکر:
خوب اینکه خیلی واضحه ما یک i داریم که مقدارش برحسب m تغییر می کنه وقتی که ما با کلید ها مقدار m را کم و زیاد کنیم چون مقدار i بوسیله m تعیین می شه پس در نتیجه سرعت چرخش کم و زیاد می شه ....
اینم مثل بقیه است فقط دوتا دایره و یک نقطه بیشتر باید روی کاربرد این دقت کنی glPushMatrix();
عزیز جان من از ظهر هزار تا چیز بلکه امتحان کردم و نشد ... سیزدهمونم با برنامه در شد :لبخند: ... دادا رو کن ببینیم چجوریه ... نمی دونم چرا با C++ و OpenGL اصلا راحت نیستم ... C# خیلی بهتره به نظرم ...
ببین شما با سی شارپ بنویس قبولت داریم...............:چشمک: با وی بی هم نوشتی مسئله ایی نیست
خب با C# هم بنویسم باز OpenGl داره دیگه ... ولی ای کاش یه سری پروژه آماده ساده بود تا آدم از روش یاد می گرفت ... چشم بسته که نمی شه نوشت داداشی ... اگه آدرسی چیزی تو نت داری که از اینا داره رو کن ... این آخرین تمرینم بزار که ما تو کفیم ...:کف:
راستش اینو خودم تا الان ننوشتم اما برای تمرین یک کتاب به نام رد بوک Red book تمرینای خیلی خیلی ساده داره یک نگاه به تمریناش بنداز
اینم کد همون دو تا دایره با تنظیم سرعت :
#include <GL/glut.h>
float g_fSpeed;
float g_fCur_Angle;
void special( int key, int x, int y)
{
switch(key)
{
case GLUT_KEY_UP:
g_fSpeed+=0.1f;
break;
case GLUT_KEY_DOWN:
g_fSpeed-=0.1f;
break;
}
}
//
void GL_Display(void)
{
g_fCur_Angle += g_fSpeed;
// pak kardane safhe
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_SILHOUETTE);
gluDisk (circle,0,0.8,5000,1);
gluDeleteQuadric(circle);
// daire aval
glPushMatrix();
glPointSize(5.0);
glRotatef(g_fCur_Angle,0,0,0.1);
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_POINTS);
glVertex2f(0.25, 0.75);
glEnd();
glPopMatrix();
// daire dovom
glPushMatrix();
glPointSize(10.0);
glRotatef(-g_fCur_Angle,0,0,0.1);
glColor3f(1.0, 0.0, 1.0);
glBegin(GL_POINTS);
glVertex2f(0.25, 0.75);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
// initialize function
void GL_Init(void)
{
// pak kardane safhe ba range sefid
glClearColor(1.0,1.0,1.0,1.0);
// tanzim sorat harkat be 1
g_fSpeed = 1.0f;
g_fCur_Angle = 0.0f;
// narma kardane (daire kardan) nogat
glEnable(GL_POINT_SMOOTH);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(500,500);
glutInitWindowSize(400,400);
glutCreateWindow("Circle");
GL_Init(); // initializing OpenGL
glutDisplayFunc(GL_Display);
glutIdleFunc(GL_Display);
glutSpecialFunc(special);
glutMainLoop();
return 0;
}
فکر کنم دنبال این بودین بازم اگر چیزی رو جا انداخته باشم بگین.
نمی دونم پویا جون تو چرا به ما که می رسی دقت نمی کنی اینو که جواب دادیم سوال سوم الان مسئله است ؟https://barnamenevis.org/showpo...7&postcount=77
الان مسئله اینه
3- برنامه ایی بنویسید که در آن یک دایره رو محیط دایره دیگر گردش کرده و این مجموعه نیز دور یک دایره بزرگ تر حرکت کنند.
اینم جواب مسئله ی سوم
#include <windows.h>
#include <GL/glut.h>
GLfloat i=0;
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glColor3f(1.0, 0.5, 0.0);
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_SILHOUETTE );
gluDisk (circle,0,0.77,500,1);
glRotatef(i,0,0,-i);
glTranslatef(0.55,0.55,0);
glPushMatrix();
glColor3f(1.0, 0.0, 1.0);
gluQuadricDrawStyle (circle, GLU_LINE );
gluDisk (circle,0,0.15,10,1);
gluDeleteQuadric(circle);
glPopMatrix();
glPushMatrix();
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
i-=0.04;
glRotatef(i*2,0,0,0.1);
glPointSize(5.0);
glColor3f(0.0, 1.0, 1.0);
glBegin(GL_POINTS);
glVertex2f(0.11, 0.11);
glEnd();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("Circle - 01");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutMainLoop();
return 0;
}
سلام
شرمنده از اونجا که وقت ندارم. نمی تونم تاپیک ها طولانی رو بخونم و سعی میکنم تنها به مشکل رسیدگی کنم؟!!!!:چشمک:
اما در مورد این مسال: همه اینها مثالهای ساده push/pop هستند. بهتون پیشنهاد میکنم که کلا بیخیال push و pop بشین و برین بجاش مستقیما روی ماتریسهای اینها کار کنین. عملا وقتی که بخواین یه پروژه بزرک رو شروع کنید و یا وقتی که بخوایید از OpenGL 3.0 به بعد استفاده کنید دیگه نمی تونید از این دستورها کمک بگیرین. حتی توی OpenGL 2.x هم زمانی که بخوایین از شیدرها استفاده بکنید این مساله تا حدودی مخصوصا برای شیدرها پیچیده صحت پیدا میکنه:
توی GLSL ویرایش ها 110 (1.10) و 120 ( نیازمند OpenGL 2.1 ، ویرایش 1.2) چند متغییر وجود دارن که می تونین به کمک اونها ماتریس ها مدل نما و ... رو بدست بیارین (مثلا متغییرهای توکار gl_ModelViewMatrix و gl_NormalMatrix) اما داخل ویرایش های بالاتر GLSL یعنی هسته 130 به بالا این متغییرها حذف شدن.
به طور کلی استفاده از push/pop ماتریسها از رده خارج شده و استفاده از اونها برای برنامه نویسی گرافیکی حرفه ای به طور کل (کاملا) مشکل ساز هستش.
برنامه ایی بنویسید که شکل ضمیمه را پیاده سازی کند؟
سلام ... من اینو نوشتم ولی نمی دونم چطوری باید دایره رو نصف کنم ...
#include <math.h>
#include <GL/glut.h>
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(1.0, 0.0, 0.0);
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_SILHOUETTE);
gluDisk (circle,0,0.4,5000,1);
gluDeleteQuadric(circle);
glBegin(GL_LINES);
glVertex2f(0.90, 0.0);
glVertex2f(0.40, 0.0);
glVertex2f(-0.40, 0.0);
glVertex2f(-0.90, 0.0);
glEnd();
glutSwapBuffers() ;
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("mS Circle");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutMainLoop();
return 0;
}
راهنمایی کنید اینم حله ... فایلشم گذاشتم ...
ببین منم نمی دونم چطور باید دایره را نصف کرد ولی می شه دایره را با مختصات قطبیش رسم کرد.
فرض کن اصلا از این کد نمی تونیم استفاده کنیم
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_SILHOUETTE);
gluDisk (circle,0,0.4,5000,1);
gluDeleteQuadric(circle);
البته میشه روشو با یک مربع سفید پوشش داد تا نصفش معلوم باشه ولی یک راه دیگه البته چند راه داره
همینو اگه بخوایم با یک مربع سفید بپوشونیم چه باید بکنبم ؟
از تابع زیر می شه استفاده کرد
glRectf ( x1 , y1 , x2 , y2 ) ;
#include <math.h>
#include <GL/glut.h>
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(1.0, 0.0, 0.0);
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_SILHOUETTE);
gluDisk (circle,0,0.4,5000,1);
gluDeleteQuadric(circle);
glBegin(GL_LINES);
glVertex2f(0.90, 0.0);
glVertex2f(0.40, 0.0);
glVertex2f(-0.40, 0.0);
glVertex2f(-0.90, 0.0);
glEnd();
glColor3f(1.0, 1.0, 1.0);
glRectf ( -0.4 , -0.5 , 0.4 , 0 ) ;
glutSwapBuffers() ;
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("mS Circle");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutMainLoop();
return 0;
}
http://www.novinupload.com/images/09...9174566163.bmp
آخرش کار خودت رو کردی ها من منظورم این بود
#include <math.h>
#include <GL/glut.h>
GLfloat pi=3.1415;
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.5, 0.0);
glBegin(GL_LINE_STRIP);
glVertex2f( 0.9,0.0);
for(GLfloat i=0.0;i<=180;i+=1.0)
glVertex2f(0.5*cos((pi/180)*i),0.5*sin((pi/180)*i));
glVertex2f(-0.9,0.0);
glEnd();
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("Circle - 03");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutMainLoop();
return 0;
}
سوال بعدی ساخت یک صفحه ی شطرنج ساده ؟
البته راههای مختلفی وجود داره ... :بامزه:نقل قول:
آخرش کار خودت رو کردی ها من منظورم این بود ...
من اینو نوشتم می خوام بدونم اشکالش کجاست ... حدس میزنم تو خیلی حلقه میوفته اما نمی دونم چطور باید کنترل کرد ...
#include <math.h>
#include <GL/glut.h>
void Display(void)
{
float i , j ;
int c=1 ;
for(i=0;i=10;i++)
{
for(j=0;j=10;j++)
{
c+=1;
if(c%2==1)
{
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(0.0, 0.0, 0.0);
}
else
{
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(1.0, 1.0, 1.0);
}
glRectf ( -i/10 , -j/10 , i/10 , j/10 ) ;
}
}
glutSwapBuffers() ;
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("mS Circle");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
//glutIdleFunc(Display);
glutMainLoop();
return 0;
}
اینم کامل اصلاح شد
#include <math.h>
#include <GL/glut.h>
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT) ;
int c=1,i , j ;
glTranslatef(-0.8,-0.8,0);
for(j=0;j<8;j++){
for(i=0;i<8;i++)
{
c+=1;
if(c%2==1)
{
glColor3f(0.0, 0.0, 1.0);
}
else
{
glColor3f(1.0, 1.0, 0.0);
}
glRectf ((i*0.21 ), (j*0.21 ) , (i*0.21)+0.2 , (j*0.21 )+0.2 ) ;
}c+=1;}
glutSwapBuffers() ;
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("Circle -04");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(Display);
glutMainLoop();
return 0;
}
برنامه بعدی مهره اسب را طراحی کنید؟