三角正占据整个窗口?

时间:2010-10-06 22:41:00

标签: c++ opengl

我正在尝试使用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();
}

它应该在400x400窗口的原点(0,0)绘制等边40x40三角形。我做错了吗?

2 个答案:

答案 0 :(得分:2)

您似乎将3D(世界)坐标与2D(屏幕)坐标混淆。传递给glVertex2f的坐标是3D坐标,需要在窗口中显示之前进行适当的转换。窗口的大小并不重要:您可以随时设置投影矩阵,以便在任何窗口中显示所需的3D空间。

在初始化OpenGL之后,您还没有设置任何变换,所以您使用的是默认矩阵,它位于3D空间的原点(0,0,0),三角形绘制在您的正上方。

这是一个quick tutorial,它向您展示如何设置转换矩阵,以便您可以从远处查看三角形。

答案 1 :(得分:0)

在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]