我正在尝试使用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三角形。我做错了吗?
答案 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]