2015-03-11 9 views
0

У меня есть проблема относительно моего OpenGL кода, я пытаюсь использоватьC++ OpenGL Glutsphere вопрос расположения

glTranslatef

просто обновить свою glutsolidsphere местоположение, но все, что я пытаюсь изменить .. это сделать все остальные ненужные объекты перемещаются и к краю экрана экрана, но получается так: «the image» .it переместить весь мой другой объект .. что не так с моим кодом?

/* * hello.c * This is a simple, 
introductory OpenGL program. */ 
#include <GL/glut.h> 

void display(void) 
{ 
/* clear all pixels */ 
glClear (GL_COLOR_BUFFER_BIT); 
/* draw white polygon (rectangle) with corners at 
*(0.25, 0.25, 0.0) and (0.75, 0.75, 0.0) */ 
glColor3f (1.0, 0.0, 0.0); 
glBegin(GL_TRIANGLES); 
glVertex3f (0.50, 0.70, 0.0); 
glVertex3f (0.40, 0.60, 0.0); 
glVertex3f (0.60, 0.60, 0.0); 
glEnd(); 
glFlush(); 

glColor3f (0.0, 1.0, 0.0); 
glBegin(GL_POLYGON); 
glVertex3f (0.40, 0.20, 0.0); 
glVertex3f (0.60, 0.20, 0.0); 
glVertex3f (0.60, 0.40, 0.0); 
glVertex3f (0.40, 0.40, 0.0); 
glEnd(); 
glFlush(); 

glColor3f (0.0, 1.0, 1.0); 
glBegin(GL_POLYGON); 
glVertex3f (0.30, 0.30, 0.0); 
glVertex3f (0.32, 0.30, 0.0); 
glVertex3f (0.40, 0.38, 0.0); 
glVertex3f (0.40, 0.40, 0.0); 
glVertex3f (0.30, 0.40, 0.0); 
glEnd(); 
glFlush(); 

glColor3f (0.0, 1.0, 1.0); 
glBegin(GL_POLYGON); 
glVertex3f (0.60, 0.38, 0.0); 
glVertex3f (0.68, 0.30, 0.0); 
glVertex3f (0.70, 0.30, 0.0); 
glVertex3f (0.70, 0.40, 0.0); 
glVertex3f (0.60, 0.40, 0.0); 
glEnd(); 
glFlush(); 

glColor3f (0.0, 0.0, 1.0); 
glBegin(GL_LINE_STRIP); 
glVertex3f (0.25, 0.24, 0.0); 
glVertex3f (0.30, 0.29, 0.0); 
glVertex3f (0.35, 0.24, 0.0); 
glVertex3f (0.40, 0.29, 0.0); 
glVertex3f (0.45, 0.24, 0.0); 
glVertex3f (0.50, 0.29, 0.0); 
glVertex3f (0.55, 0.24, 0.0); 
glVertex3f (0.60, 0.29, 0.0); 
glVertex3f (0.65, 0.24, 0.0); 
glVertex3f (0.70, 0.29, 0.0); 
glVertex3f (0.75, 0.24, 0.0); 
glEnd(); 
glFlush(); 

glColor3f (0.0, 1.0, 1.0); 
glBegin(GL_LINE_STRIP); 
glVertex3f (0.25, 0.19, 0.0); 
glVertex3f (0.30, 0.24, 0.0); 
glVertex3f (0.35, 0.19, 0.0); 
glVertex3f (0.40, 0.24, 0.0); 
glVertex3f (0.45, 0.19, 0.0); 
glVertex3f (0.50, 0.24, 0.0); 
glVertex3f (0.55, 0.19, 0.0); 
glVertex3f (0.60, 0.24, 0.0); 
glVertex3f (0.65, 0.19, 0.0); 
glVertex3f (0.70, 0.24, 0.0); 
glVertex3f (0.75, 0.19, 0.0); 
glEnd(); 
glFlush(); 

glColor3f (0.0, 0.0, 1.0); 
glBegin(GL_LINE_STRIP); 
glVertex3f (0.25, 0.14, 0.0); 
glVertex3f (0.30, 0.19, 0.0); 
glVertex3f (0.35, 0.14, 0.0); 
glVertex3f (0.40, 0.19, 0.0); 
glVertex3f (0.45, 0.14, 0.0); 
glVertex3f (0.50, 0.19, 0.0); 
glVertex3f (0.55, 0.14, 0.0); 
glVertex3f (0.60, 0.19, 0.0); 
glVertex3f (0.65, 0.14, 0.0); 
glVertex3f (0.70, 0.19, 0.0); 
glVertex3f (0.75, 0.14, 0.0); 
glEnd(); 
glFlush(); 

glColor3f (1.0, 1.0, 0.0); 
glTranslatef(0.20,0.27,0.0); 
glutSolidSphere(0.06, 20, 20); 
glFlush(); 
/* don't wait! 
* start processing buffered OpenGL routines */ 
} 
void init (void) 
{ 
/* select clearing color */ 
glClearColor (1.0, 1.0, 1.0, 1.0); 
/* initialize viewing values */ 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 
} 
/* 
* Declare initial window size, position, and display mode 
* (single buffer and RGBA). Open window with "hello" 
* in its title bar. Call initialization routines. 
* Register callback function to display graphics. 
* Enter main loop and process events. */ 
int main(int argc, char** argv) 
{ 
glutInit(&argc, argv); 
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
glutInitWindowSize (900, 600); 
glutInitWindowPosition (50, 100); 
glutCreateWindow ("hello"); 
init(); 
glutDisplayFunc(display); 
glutMainLoop(); 
return 0; 
/* ANSI C requires main to return int. */ 
} 

ответ

0

Большая часть OpenGL действует как конечный автомат, что означает, что настройки «приклеиваются», пока вы не измените их снова. Это включает в себя состояние преобразования. Так что, когда вы звоните:

glTranslatef(0.20,0.27,0.0); 

все, что вы рисуете после того, как эта точка будет переведена. И если вы назовете glTranslatef() несколько раз, преобразования будут накапливаться, что означает, что вы будете переводить все больше и больше.

Если это не то поведение, которое вы хотите, вам необходимо восстановить преобразование в предыдущее состояние после рисования сферы. Самый простой способ сделать это - glPushMatrix()/glPopMatrix(). Матрицы преобразования в устаревших OpenGL управляются как стек, а нажатие/всплытие матрицы восстанавливает предыдущее состояние.

код вокруг рисования сферу будет выглядеть следующим образом:

glPushMatrix(); 
glTranslatef(0.2f, 0.27f , 0.0f); 
glutSolidSphere(0.06, 20, 20); 
glPopMatrix(); 
+0

ой теперь я понимаю ... спасибо за вашу помощь ... –

Смежные вопросы