2014-11-02 2 views
0

У меня есть функция, которая рисует круг.Проблема с радиусом круга OpenGL при рисовании квадрата

glBegin(GL_LINE_LOOP); 
for(int i = 0; i < 20; i++) 
{ 
    float theta = 2.0f * 3.1415926f * float(i)/float(20);//get the current angle 

    float rad_x = ratio*(radius * cosf(theta));//calculate the x component 
    float rad_y = radius * sinf(theta);//calculate the y component 

    glVertex2f(x + rad_x, y + rad_y);//output vertex 

} 
glEnd(); 

Это работает денди. Я сохраняю значения x, y и радиуса в моем объекте.

Однако, когда я пытаюсь нарисовать квадрат следующего вызова функции:

newSquare(id, red, green, blue, x, (x + radius), y, (y + radius)); 

я получаю следующее изображение.

enter image description here

Как вы видите, площадь почти в два раза шире (больше похож на диаметр). Следующий код - это то, как я создаю квадрат. Как видите, он начинается в центре круга, в котором он должен. И должен растянуться до края круга.

glBegin(GL_QUADS); 
    glVertex2f(x2, y2); 
    glVertex2f(x2, y1); 
    glVertex2f(x1, y1); 
    glVertex2f(x1, y2); 
glEnd(); 

Я не могу понять, почему это так!

+0

Ваш код выглядит правильно (при условии, что 'ratio = 1'). Вероятно, вы установили неправильные параметры при построении круга. Очевидно, что обе переменные «radius» не совпадают. –

+0

Мое соотношение - это ширина/высота родительского окна! Я буду исследовать. –

+1

О, так вы делаете ручную проекцию. Вы должны оставить это в матрице проекции. Это гарантирует, что все объекты находятся в одной и той же системе координат. Например. у вас нет x-исправленного вашего квадроцикла. –

ответ

1

Если вы исправляете положение x для одного объекта, вы должны сделать это и для всех остальных.

Однако, если вы продолжите это, вы попадете в беду очень скоро. В вашем случае исправляется только ширина объектов, но не их позиции. Вы можете решить все свои проблемы, установив матрицу орфографической проекции, и вам больше не понадобится исправлять позиции. Например. как так:

glMatrixMode(GL_PROJECTION); //switch to projection matrix 
glOrtho(-ratio, ratio, -1, 1, -1, 1); 
glMatrixMode(GL_MODELVIEW); //switch back to model view 

где

ratio = windo width/window height 

Это создает систему координат, где верхний край имеет y=1, нижний край y=-1, а левые и правые стороны имеют x=-ratio и x=ratio, соответственно.

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