Рисование часовых меток часов с использованием 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, но независимо от того, как я его использую, он не работает.

0

Решение

3d проблема

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

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

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

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

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

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

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();
}
3

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

Других решений пока нет …

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