Треугольник занимает все окно? - PullRequest
0 голосов
/ 07 октября 2010

Я пытаюсь нарисовать треугольник, используя GL_POLYGON, но по какой-то причине он занимает все окно ..

...
typedef struct myTriangle {
   float tx;
   float ty;
} myTriangle;

std::vector<myTriangle> container;

void display() {
   glClear(GL_COLOR_BUFFER_BIT);

   for(int i = 0; i < (int)container.size(); ++i) {
      glBegin(GL_POLYGON);
      glColor3f(0.35, 0.0, 1.0);
      glVertex2f(container.at(i).tx, container.at(i).ty + 20);
      glVertex2f(container.at(i).tx - 20, container.at(i).ty - 20);
      glVertex2f(container.at(i).tx + 20, container.at(i).ty - 20);
      glEnd();
   }

   glutSwapBuffers();
}

...

int main(int argc, char** argv) {
   myTriangle t1;
   container.push_back(t1);
   container.back().tx = (float)0.;
   container.back().ty = (float)0.;

   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_DOUBLE);

   // initializations
   glutInitWindowSize(400, 400);
   glutInitWindowPosition(100, 100);
   glutCreateWindow( "Transformer" );
   glClearColor(1.0, 1.0, 1.0, 1.0);

   // global variable initialization
   GW = GH = 200;

   // callback functions
   glutDisplayFunc(display);
   glutMouseFunc(mouse);
   glutMotionFunc(mouseMove);
   glutKeyboardFunc(keyboard);

   glutMainLoop();
}

Следует нарисовать равносторонний треугольник 40x40 в начале координат (0,0) в окне 400x400. Что-то я не так сделал?

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Вы, кажется, путаете 3D (мировые) координаты с 2D (экранными) координатами. Координаты, которые вы передаете glVertex2f, являются трехмерными координатами, которые необходимо соответствующим образом преобразовать, прежде чем они будут отображены в вашем окне. Размер вашего окна не имеет значения: вы всегда можете настроить матрицу проекции так, чтобы в любом окне отображалось столько трехмерного пространства, сколько вы хотите.

Вы не настроили никаких преобразований после инициализации OpenGL, поэтому вы используете матрицу по умолчанию, которая находится в начале координат (0,0,0) в трехмерном пространстве и треугольник рисуется прямо над вами.

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

0 голосов
/ 08 октября 2010

В OpenGL ваш экран определяется от [-1, -1] до [1, 1].Это то, как работают системы рендеринга.

Попробуйте сделать

glScalef(2.0f/400, 2.0f/400, 1);
glTranslatef(-1f, -1f, 0);

То, что теперь делает видеокарта, это берет ваши вершины, которые определены в пикселях, и преобразует их так, чтобы они правильно располагались внутриОт -1, -1] до [1, 1].

Вы увидите, что он сначала масштабирует его от границы [0,0] - [400, 400] до [0, 0]- [2, 2].Это переводит его в окончательный [-1, -1] - [1, 1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...