Рисование часовых меток часов с использованием OpenGL

Вот мой код:

void drawClock(void) 
{ 

glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f(0.0,0.0,0.0);


for(int i=0; i<12; i++){

    glRotatef(30,0,0,1);
    glTranslatef(5.2,0.0,0.0);
    glutWireCube(2.0);

}

glFlush(); 
} 

Вот моя функция изменения формы (без нее я ничего не вижу, хотя я не уверен, как она на самом деле работает)

void changeSize(int w, int h) {
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if(h == 0) h = 1;
float ratio = 1.0* w / h;
// Reset the coordinate system before modifying
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(45,ratio,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,70.0, 
0.0,0.0,-1.0,
0.0f,1.0f,0.0f);
}

Поэтому я пытаюсь нарисовать часовые метки часов, используя проволочные кубики размером 2.0, и каждый из этих кубов должен находиться на расстоянии 5,2 единицы от центра. Это для задания, я знаю, что это, вероятно, очень просто, но я просто не могу заставить его работать должным образом. Моя проблема в том, что кубы появляются в 3D, но я хочу, чтобы они появлялись в 2D, так как в этом случае я бы видел только одно лицо. Кроме того, круг не по центру, я не понимаю, почему. Я знаю, что должен использовать pushMatrix и popMatrix, но независимо от того, как я его использую, он не работает.

1 ответ

3d проблема

gluPerspective делает перспективную проекцию. Чтобы выполнить то, что вам нужно, вы должны вместо этого применить ортографическую проекцию.

Лучший способ сделать это с вашим текущим кодом для нас glOrtho предоставить левую, правую, нижнюю, верхнюю, дальнюю, ближнюю рамку, внутри которой все будет "казаться" 2D. Попробуйте код ниже вместо gluPerspective,

glOrtho(10.0f,-10.0f,10.0f,-10.0f,10.0f,-10.0f,10.0f);

Положение проблемы

Я не уверен в этом преобразовании, так как некоторое время не использовал немедленный режим. Обратите внимание, порядок операций имеет значение.

Что касается push/pop матриц, это в основном стек 4x4 матриц, детализирующих преобразования. Я уверен, что это работает по принципу

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslate(x,y,z);// Where x,y,z is the starting point of your clock
for(int i=0; i<12; i++){
    glPushMatrix();
    glRotatef(i * 30,0,0,1);
    glTranslatef(5.2,0.0,0.0);
    glutWireCube(2.0);
    glPopMatrix();
}
Другие вопросы по тегам