Помогите с отображением объекта
| |
radogost123 | Дата: Суббота, 04 Февраля 2012, 01:04 | Сообщение # 1 |
уже был
Сейчас нет на сайте
| Помогите разобраться. Шарик никак не хочет отображаться. Может это фон закрашивает его, но куб отображается а со слоями нигде ничего не трогал. Иногда кажется, что при запуске программы он мигает, а потом исчезает. Code #include <glut.h> #include <GL/GL.h> #include <GL/glu.h> #include <GL/glaux.h> #include <stdlib.h>
// ширина и высота окна GLint width=800, height=600; GLint x1,x2,y2; // координаты шарика и отбивалки
//рисуем шарик
void DrawBall() {
glPushMatrix (); //glTranslatef (1, 1, 1); glColor3f(1,0,0); glutSolidSphere (1.0, 15, 15); glPopMatrix ();
}
// рисуем отбивалку
void DrawCubik () { int Cwidth=50, Cheight=20; int left, bottom, top, right; // положение left = x1; right=x1+Cwidth; top= height/3-Cheight; bottom= top-Cheight;
// рисуем прямоугольник glBegin (GL_QUADS); glColor3f(1,0,0);
// вершины glVertex2f(left,bottom); glVertex2f(left,top); glVertex2f(right,top); glVertex2f(right,bottom); glEnd();
}
void Reshape(GLint w, GLint h) { width = w; height = h; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, w, 0, h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
void movecubik () {} void Paint () {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );// чистка буферов glClearColor(0.4f,0.8f,1,0); // заливка DrawBall (); DrawCubik(); glFinish();// чё то там о невозможности завершить програму без выполнения всего что выше glutSwapBuffers(); // для движение переставляем кадры } int main (int argv, char **argc) { glutInit(&argv,argc); //инициализация окна glutInitDisplayMode (GLUT_RGBA | GLUT_SINGLE |GLUT_DEPTH ); // двойной буффер параметр глубина glutInitWindowSize ( width, height); // размеры окна glutInitWindowPosition (0,0); // начальное положение окна glutCreateWindow ("byaka"); // название окна // функции glutDisplayFunc (Paint); // функция рисования обьектов // glutKeyboardFunc (Keyboard); // работа клавиатуры glutIdleFunc (Paint); // функция постоянного обращения glutReshapeFunc(Reshape); glEnable(GL_STENCIL_TEST); glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL);
glutMainLoop(); //зацикливание return 0; }
Сообщение отредактировал radogost123 - Суббота, 04 Февраля 2012, 01:06 |
|
| |
creek | Дата: Суббота, 04 Февраля 2012, 13:26 | Сообщение # 2 |
был не раз
Сейчас нет на сайте
| Во 1: Не вижу где задаются: "x1,x2,y2" Во 2: Попробуй рисовать просто кубик, потом просто шар. Дабы исключить возможность перекрывания.
|
|
| |
Apati | Дата: Суббота, 04 Февраля 2012, 14:14 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| По-моему шар рисуется слишком маленьким. Попробуй заменить glutSolidSphere (1.0, 15, 15); на glutSolidSphere (100.0, 15, 15); и glOrtho(0, w, 0, h, -1.0, 1.0); на glOrtho(0, w, 0, h, -100.0, 100.0);
|
|
| |
radogost123 | Дата: Вторник, 07 Февраля 2012, 21:42 | Сообщение # 4 |
уже был
Сейчас нет на сайте
| Спасибо. И вправду шарик где то не там рисовался. glOrtho(0, w, 0, h, -100.0, 100.0); Правда мне казалось что изначально он в начале координат рисует его.Добавлено (07.02.2012, 21:42) --------------------------------------------- Вобщем получился такой арканойд. Но возникла проблема. Иногда мячик попадат в промежуток между кубиками. Их можно былобы нарисовать вплотную но тогда цвет сливается. Вообщем подскажите как лучше это исправить. П.С. могу выложить с нормальными коментами но декодор при этом часть кода исправляет. Code #include <glut.h> #include <GL/GL.h> #include <GL/glu.h> #include <GL/glaux.h> #include <iostream.h> #include <math.h>
// glut32.lib opengl32.lib glu32.lib
int width=800, height=600; // øèðèíà è âûñîòà îêíà bool BallG,BallR,BallL,CubikActiv; // äâèæåíèå øàðà // int // íà÷àëüíûå êîîðäèíàòû øàðà int step=15; //ñêîðîñòü îòáèâàëêè øàðà int Cwidth=80, Cheight=20, Cleft=370,Ctop=120;// ðàçìåðû îòáèâàëêè float left=50, bottom=500,right,top,i,j; // êóáèêè float a1,a2, stepBall, x2=380, y2=380; bool mas[6][15]={{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},{true,true,true,true,true,true,true,true,true,true,true,true, true,true,true},{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},{true,true,true,true,true,true,true,true,true,t rue,true,true,true,true,true}, {true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},{true,true,true,true,true,true,true,true,true,true,true,true,tr ue,true,true}}; void PaintKubiki () // ðèñóåì cubiki { for (int i=1;i<6;i++) // 3 ñòîëáöà êóáèêîâ for (int j=1;j<14;j++) // 15 êóáèêîâ â ëèíèè { left=50*j; right=left+49.5; bottom=600-50*i; top=bottom+49.5; // ðèñóåì ïðÿìîóãîëüíèê glPushMatrix (); glBegin (GL_QUADS);
if ((y2<=top)&&(y2>=bottom)&&(x2>=left)&&(x2<=right)&&(mas[i][j])&&(!BallG))// åñëè øàð íàòûêàåòñÿ íà êóáèê ëåòèò âíèç è êóáèê èñ÷åçàåò { BallG=true; mas[i][j]=false; } if ((y2<=top)&&(y2>=bottom)&&(x2>=left)&&(x2<=right)&&(mas[i][j])&&(BallG)) // øàð íàëåòàåò ñâåðõó { BallG=false; mas[i][j]=false; } if ((y2<=top)&&(y2>=bottom)&&(x2>=left)&&(x2<=right)&&(mas[i][j]=false))// åñëè øàð íàòûêàåòñÿ íà èñ÷åçíóâøèé êóáèê ëåòèò äàëüøå { BallG=false;
}
if (mas[i][j]) { glColor3f(0.3f,0.4f,0.1f); // èçíà÷àëüíûé öâåò } else { glColor3f(0,0,0); // çàêðàøèâàåì öâåòîì ôîíà } // âåðøèíû glVertex2f(left,bottom); glVertex2f(left,top); glVertex2f(right,top); glVertex2f(right,bottom); glEnd(); glPopMatrix (); } } void Keyboard (int key, int x, int y) // ôóíêöèÿ äëÿ ñïåöèàëüíûõ êíîïîê { switch(key) {case GLUT_KEY_LEFT: if (Cleft>0) Cleft-=step; //íàëåâî break; case GLUT_KEY_RIGHT: if (Cleft<720) Cleft+=step; // íàïðàâî break; } glutPostRedisplay(); // ïåðåðèñîâêà èçîáðàæåíèÿ (êîñâåííûé âûçîâ display();) } void DrawCubik () // ðèñóåì îòáèâàëêó { int Cbottom, Cright; // ïîëîæåíèå Cright=Cleft+Cwidth; Cbottom= Ctop-Cheight;
// ðèñóåì ïðÿìîóãîëüíèê glPushMatrix (); glBegin (GL_QUADS); glColor3f(1,1,0);
// âåðøèíû glVertex2f(Cleft,Cbottom); glVertex2f(Cleft,Ctop); glVertex2f(Cright,Ctop); glVertex2f(Cright,Cbottom); glEnd(); glPopMatrix (); } void BallmoveDown() // äâèæåíèå øàðèêà ââåðõ/âíèç { if (BallG) y2-=3; else y2+=3; if (y2>600) BallG=true; if (y2<40) BallG=false;
} void BallmoveRightLeft() // îòáèâàíèå øàðèêà {
if (x2>760) // ïðàâûé êðàé ýêðàíà { BallL=true; BallR=false; stepBall=1; } if (x2<40) // ëåâûé êðàé ýêðàíà { BallR=true; BallL=false; } a1=x2-Cleft; a2=a1/40; if ((a2<1)&&(a2>0)&&(y2<=Ctop)) { stepBall=1-a2; BallL=true; BallG=false; BallR=false; }
if ((a2>=1)&&(a2<2)&&(y2<=Ctop)) { stepBall=1-a2; BallL=false; BallG=false; BallR=true;
} if (BallR) x2+=4*fabs(stepBall); // øàðèê ëåòèò âïðàâî if (BallL) x2-=4*stepBall; // øàðèê ëåòèò âëåâî } /* if ((x2-Cleft>0)&&(x2-Cleft<30)&&(y2<=Ctop)) // åñëè ïîïàäàåò íà ëåâóþ ÷àñòü áèòû ëåòèò âëåâî { BallL=true; BallG=false; BallR=false; } if ((x2-Cleft<80)&&(x2-Cleft>50)&&(y2<=Ctop)) // åñëè ïîïàäàåò íà ïðàâóþ ÷àñòü áèòû ëåòèò âïðàâî { BallR=true; BallG=false; BallL=false; } if ((x2-Cleft>=30)&&(x2-Cleft<=50)&&(y2<=Ctop)) // åñëè ïîöåíòðó ëåòèò ââåðõ { BallR=false; BallL=false; BallG=false; } */
void DrawBall() // ðèñóåì øàðèê {
glPushMatrix (); glTranslatef (x2, y2, 0); glColor3f(1,1,1); glutSolidSphere (10.0, 100, 100); glPopMatrix (); }
void Reshape(GLint w, GLint h) { width = w; height = h; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, w, 0, h, -100, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void Paint () {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );// ÷èñòêà áóôåðîâ glClearColor(0,0,0,0); // çàëèâêà ôîíà // âûçûâàåì ô-èè ðèñîâàíèÿ DrawCubik(); DrawBall (); BallmoveDown(); BallmoveRightLeft(); PaintKubiki (); glFinish();// ÷¸ òî òàì î íåâîçìîæíîñòè çàâåðøèòü ïðîãðàìó áåç âûïîëíåíèÿ âñåãî ÷òî âûøå glutSwapBuffers(); // äëÿ äâèæåíèå ïåðåñòàâëÿåì êàäðû } int main (int argv, char **argc) { glutInit(&argv,argc); //èíèöèàëèçàöèÿ îêíà glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE |GLUT_DEPTH ); // äâîéíîé áóôôåð ïàðàìåòð ãëóáèíà glutInitWindowSize ( width, height); // ðàçìåðû îêíà glutInitWindowPosition (0,0); // íà÷àëüíîå ïîëîæåíèå îêíà glutCreateWindow ("byaaka"); // íàçâàíèå îêíà // ôóíêöèè glutDisplayFunc (Paint); // ôóíêöèÿ ðèñîâàíèÿ îáüåêòîâ glutSpecialFunc (Keyboard); // ðàáîòà êëàâèàòóðû glutReshapeFunc(Reshape); glutIdleFunc (Paint); // ôóíêöèÿ ïîñòîÿííîãî îáðàùåíèÿ glEnable(GL_STENCIL_TEST); glEnable(GL_DEPTH_TEST); // àêòèâèðóåì ïàðàìåòîð ãëóáèíû glEnable(GL_COLOR_MATERIAL); // àêòèâèðóåì âîçìîæíîñòü çàêðàøèâàòü îáüåêòû
glutMainLoop(); //çàöèêëèâàíèå return 0; }
Сообщение отредактировал radogost123 - Понедельник, 06 Февраля 2012, 03:22 |
|
| |
|