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

0

Я создал программу в 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" несколько раз. В любом случае, как мне изменить свой код, чтобы куб и сфера были масштабированы на основе пользовательского ввода, но первый квадрат не затронут?

Теги:
opengl
3d
scale
shape

1 ответ

2
Лучший ответ

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();
  • 0
    Это также масштабирует переводы. Если вы этого не хотите, то выполните glPushMatrix / glScaled / glutSolidXXXX () / glPopMatrix для каждого из объектов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню