Масштабирование трехмерных фигур (OpenGL и C ++)

Я создал программу в OpenGL, которая рисует некоторые фигуры. Я хочу, чтобы пользователь мог увеличивать фигуры, если они этого хотят. Это код, который рисует фигуры:

/*Initialise the required OpenGL functions*/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, screenWidth, screenHeight, 0.0, -1.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glDisable(GL_CULL_FACE);
glClear(GL_DEPTH_BUFFER_BIT);

/*Draw a square*/
glColor3f(1, 0, 0);
glBegin(GL_QUADS);
glVertex2f(screenWidth * 0.75, screenHeight * 0.08333);
glVertex2f(screenWidth * 0.75, screenHeight * 0.16666);
glVertex2f(screenWidth * 0.86666, screenHeight * 0.16666);
glVertex2f(screenWidth * 0.86666, screenHeight * 0.08333);
glEnd();
glColor3f(0, 0, 0);

/*Let the user zoom*/
if (GetAsyncKeyState(VK_UP))
{
/*"zoom" is a global variable*/
zoom += 0.005;
}

glScaled(1 + zoom, 1 + zoom, 1);

/*Everything that is drawn from this point on (A sphere and a cube) should be scaled*/
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(-0.3, 0, 0);
glutSolidSphere(3, 20, 20);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.55, 0.36, 0);
glutSolidCube(0.05);

glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();

glutSwapBuffers();

Код правильно рисует фигуры, но их нельзя масштабировать. Я использовал подобный код в некоторых других функциях, поэтому я полагаю, что это может быть из-за того, что я использую 3D-фигуры, или это может иметь какое-то отношение ко мне, вызывая «glMatrixMode» несколько раз. В любом случае, как мне изменить свой код, чтобы куб и сфера масштабировались на основе пользовательского ввода, но на первый квадрат это не влияло?

0

Решение

glScaled () изменяет текущую матрицу. Поэтому, как только вы вызываете glLoadIdentity (), вы отменяете свое масштабирование. Вы делаете много ненужных вызовов glMatrixMode () и glLoadIdentity (), которые должны быть устранены. Так что попробуйте что-то вроде этого:

// You probably don't really need to do these, but if you do, do it once up top.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPushMatrix(); // Save the current matrix
glScaled(1 + zoom, 1 + zoom, 1); // Scale it

/*Everything that is drawn from this point on (A sphere and a cube) should be scaled*/
glTranslatef(-0.3, 0, 0);
glutSolidSphere(3, 20, 20);

glTranslatef(0.55, 0.36, 0);
glutSolidCube(0.05);

glPopMatrix(); // Undo the glScaled() call above

glutSwapBuffers();
2

Другие решения


По вопросам рекламы [email protected]