OpenGL рисует полный экран

Я пытаюсь нарисовать 2D футбольное поле в полном окне. Тем не менее, он получает черные полосы слева и справа:
поле

Это мой код:

#include <OpenGL/gl.h> // include GLEW and new version of GL on Windows
#include <GLFW/glfw3.h> // GLFW helper library
#include <stdio.h>
#include <math.h>

void Soccer_Field();

int main() {
// start GL context and O/S window using the GLFW helper library
if (!glfwInit()) {
fprintf(stderr, "ERROR: could not start GLFW3\n");
return 1;
}

// uncomment these lines if on Apple OS X
/*glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);*/

GLFWwindow* window = glfwCreateWindow(640, 480, "Soccer field", NULL, NULL);
if (!window) {
fprintf(stderr, "ERROR: could not open window with GLFW3\n");
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(window);

// get version info
const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
const GLubyte* version = glGetString(GL_VERSION); // version as a string
printf("Renderer: %s\n", renderer);
printf("OpenGL version supported %s\n", version);

/* OTHER STUFF GOES HERE NEXT */
while(!glfwWindowShouldClose(window)) {
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, 1, 0.0, 1, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();

Soccer_Field();

// update other events like input handling
glfwPollEvents();
// put the stuff we've been drawing onto the display
glfwSwapBuffers(window);
}

// close GL context and any other GLFW resources
glfwTerminate();
return 0;
}

void Soccer_Field (void)
{
float x, y, ang, radius = 0.05;     // Not sure what the radius of the center circle should be?

static float RAD_DEG = 57.296;

glBegin (GL_QUADS);
glColor3f  (0.20, 0.60, 0.20);                           // GreenYard
glVertex2f (0.10, 0.10); glVertex2f (0.90, 0.10);
glVertex2f (0.90, 0.90); glVertex2f (0.10, 0.90);
glColor3f  (1.0, 1.0, 1.0);
glVertex2f (0.90, 0.35); glVertex2f (0.83, 0.35);        // Inner White Quad - Right
glVertex2f (0.83, 0.65); glVertex2f (0.90, 0.65);
glVertex2f (0.10, 0.35); glVertex2f (0.17, 0.35);        // Inner White Quad - Left
glVertex2f (0.17, 0.65); glVertex2f (0.10, 0.65);
glEnd ();

glColor3f (0.0, 0.0, 0.0);                                  // Change color to black

glBegin (GL_LINES);
glVertex2f (0.50, 0.10); glVertex2f (0.50, 0.90);        // Mid Line

// Left side of the Ground
glVertex2f (0.25, 0.25); glVertex2f (0.25, 0.75);        // Goal keeper front line
glVertex2f (0.10, 0.75); glVertex2f (0.25, 0.75);        // Goal keeper left line
glVertex2f (0.10, 0.25); glVertex2f (0.25, 0.25);        // Goal keeper right line

// Right Side of the Ground
glVertex2f (0.75, 0.25); glVertex2f (0.75, 0.75);        // Goal keeper front line
glVertex2f (0.75, 0.25); glVertex2f (0.90, 0.25);        // Goal keeper left  Line
glVertex2f (0.75, 0.75); glVertex2f (0.90, 0.75);        // Goal keeper right line
glEnd ();

glBegin (GL_LINE_LOOP);                                     // Circle at center of field
for (ang = 0.0; ang < 360.0; ang += 10.0)  {
x = radius * cos(ang/RAD_DEG) + 1.0;
y = radius * sin(ang/RAD_DEG) + 0.5;
glVertex2f (x/2.0, y);
}
glEnd ();
}

Как я могу это исправить? Я пытался установить окно просмотра и другие вещи, но я не могу заставить его работать.

Надеюсь, что кто-то поймет меня прямо.

Спасибо

1

Решение

Матрица проекции описывает отображение от трехмерных точек сцены к двухмерным точкам области просмотра. Матрица проекции преобразуется из пространства просмотра в пространство клипа, а координаты в пространстве клипа преобразуются в нормализованные координаты устройства (NDC) в диапазоне (-1, -1, -1) в (1, 1, 1) разделив с w компонент координат клипа.
В ортогональной проекции координаты в глазном пространстве линейно отображаются на нормализованные координаты устройства.

Матрица ортографической проекции определяется glOrtho. С помощью этих функций вы определяете поле зрения сцены.

Поскольку вся ваша геометрия находится в диапазоне от (0,1, 0,1) до (0,9, 0,9), вы должны изменить ее на:

GLdouble left   = 0.1;
GLdouble right  = 0.9;
GLdouble bottom = 0.1;
GLdouble top    = 0.9;
glOrtho(left, right, bottom, top, -1.0, 1.0);

Вторая возможность — масштабировать геометрию по матрице вида модели. Вы должны масштабировать (glScale) геометрия от [(0,1, 0,1), (0,9, 0,9)] до диапазона, который задается ортографической проекцией [(0,0, 0,0), (1,0, 1,0)]. Обратите внимание, что в этом случае вы должны «перецентрировать» геометрию (glTranslate):

glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

GLdouble scaleX = (1.0 - 0.0) / (0.9 - 0.1);
GLdouble scaleY = (1.0 - 0.0) / (0.9 - 0.1);
glScaled( scaleX, scaleY, 1.0 );
glTranslated( -0.1, -0.1, 0.0 );
0

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

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

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