C++ 三角形占据了整个窗户?

C++ 三角形占据了整个窗户?,c++,opengl,C++,Opengl,我试图用GL_多边形绘制一个三角形,但由于某些原因,它占用了整个窗口 ... 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(); +

我试图用GL_多边形绘制一个三角形,但由于某些原因,它占用了整个窗口

...
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();
}
。。。
typedef结构myTriangle{
浮动发送;
浮雕;
}我的三角;
载体容器;
无效显示(){
glClear(GLU颜色缓冲位);
对于(int i=0;i<(int)container.size();++i){
glBegin(GL_多边形);
GL3F(0.35,0.0,1.0);
glVertex2f(容器at(i).tx,容器at(i).ty+20);
glVertex2f(容器at(i).tx-20,容器at(i).ty-20);
glVertex2f(容器.at(i).tx+20,容器.at(i).ty-20);
格伦德();
}
glutSwapBuffers();
}
...
int main(int argc,字符**argv){
myTriangle t1;
容器。推回(t1);
container.back().tx=(float)0。;
container.back().ty=(float)0。;
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_双精度);
//初始化
glutInitWindowSize(400400);
位置(100100);
窗口(“变压器”);
glClearColor(1.0,1.0,1.0,1.0);
//全局变量初始化
GW=GH=200;
//回调函数
glutDisplayFunc(显示器);
glutMouseFunc(小鼠);
glutMotionFunc(mouseMove);
键盘Func(键盘);
glutMainLoop();
}

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

你似乎把3D(世界)坐标和2D(屏幕)坐标搞混了。传递给
glVertex2f
的坐标是三维坐标,在显示在窗口中之前需要进行适当转换。窗口的大小无关紧要:您始终可以设置投影矩阵,以便在任何窗口中显示任意多的3D空间

在初始化OpenGL之后,您没有设置任何转换,因此您使用的是默认矩阵,它位于三维空间的原点(0,0,0),三角形正好绘制在您的上方


下面是一个演示如何设置变换矩阵的示例,以便从远处查看三角形。

在OpenGL中,屏幕的定义范围是从[-1,-1]到[1,1]。这就是渲染系统的工作原理

试着做

glScalef(2.0f/400, 2.0f/400, 1);
glTranslatef(-1f, -1f, 0);
图形卡现在所做的是获取以像素为单位定义的顶点,并对其进行变换,使其正确位于[-1,-1]到[1,1]边界内

您将看到它首先将[0,0]-[400400]边界缩放为[0,0]-[2,2]。它将其转换为最后的[-1,-1]-[1,1]