Я пытаюсь нарисовать круг, используя GL_POLYGON
и код, который я пробовал, работает, но радиус круга кажется не в масштабе с размером окна, и я не понимаю, почему.
Вот код:
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
if(start == OFF)
{
//Set Drawing Color - Will Remain this color until otherwise specified
glColor3f(0.2, 0.3, 0.5); //Some type of blue
//Draw Circle
glBegin(GL_POLYGON);
for(double i = 0; i < 2 * PI; i += PI / 24)
glVertex3f((cos(i) * radius) + gX,(sin(i) * radius) + gY, 0.0);
glEnd();
//Draw Circle
center_x = gX;
center_y = gY;
}
glutSwapBuffers();
}
и функция init:
void init (void)
{
/* selecionar cor de fundo (preto) */
glClearColor (0.0, 0.0, 0.0, 0.0);
/* inicializar sistema de viz. */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
Я устанавливаю размер окна равным 600, а радиус, равный 1 и четверти круга, занимает все окно. Я предполагаю, что мне нужно сделать какое-то преобразование с радиусом, я просто не знаю как.
Матрица проекции описывает отображение от трехмерных точек сцены к двухмерным точкам области просмотра. Он преобразуется из пространства глаза в пространство клипа, а координаты в пространстве клипа преобразуются в нормализованные координаты устройства (NDC) путем деления на w
компонент координат клипа. НДЦ находятся в диапазоне (-1, -1, -1) — (1,1,1).
В ортогональной проекции координаты в глазном пространстве линейно отображаются на нормализованные координаты устройства.
Ортогональная проекция может быть установлена glOrtho
. Вы настраиваете область просмотра с нижним левым углом в (0, 0), верхним правым углом в (1, 1) и диапазоном глубины от -1 до 1:
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
Если вы хотите настроить проекцию, которая позволяет рисовать в масштабах окна, то вы должны сделать это следующим образом:
int wndWidth = 800; // for example a window with the size 800*600
int wndHeight = 600;
glOrtho( 0.0, (float)wndWidth, 0.0, (float)wndHeight, -1.0, 1.0 );
Если вы хотите, чтобы источник (0, 0) находился в центре окна, то вы должны сделать это так:
float w = (float)wndWidth/2.0f;
float h = (float)wndHeight/2.0f;
glOrtho( -w, w, -h, h, -1.0, 1.0 );
Смотрите дальше:
Других решений пока нет …