我想知道如何根据封闭窗口的尺寸绘制线条的长度。请注意,我使用的是GLUT和OpenGL的组合。
例如,假设我想从屏幕的底部中心画一条线(我假设这将是坐标(WINDOW_LENGTH / 2,0)到窗口的中心(WINDOW_LENGTH / 2,WINDOW_HEIGHT / 2)
如何在OpenGL中执行此操作?现在我有以下内容:
//Initializes 3D rendering
void initRendering() {
//Makes 3D drawing work when something is in front of something else
glEnable(GL_DEPTH_TEST);
}
//Called when the window is resized
void handleResize(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION); //Switch to setting the camera perspective
//Set the camera perspective
glLoadIdentity(); //
gluPerspective(45.0, (double)w / (double)h, 1.0, 200.0);
}
//Draws the 3D scene
void drawScene() {
//Clear information from last draw
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective
glTranslatef(0, 0, -1);
glBegin(GL_LINES);
//lines
glVertex2f(0, 0);
glVertex2f(0, .25);
glEnd();
glutSwapBuffers(); //Send the 3D scene to the screen
}
int main(int argc, char** argv) {
//Initialize GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400); //Set the window size
//Create the window
glutCreateWindow("Basic Shapes - videotutorialsrock.com");
initRendering(); //Initialize rendering
//Set handler functions for drawing, keypresses, and window resizes
glutDisplayFunc(drawScene);
//glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);
cout << "GLUT_WINDOW_X: " << GLUT_WINDOW_X << endl;
cout << "GlUT_WINDOW_Y: " << GLUT_WINDOW_Y << endl;
glutMainLoop(); //Start the main loop. glutMainLoop doesn't return.
return 0; //This line is never reached
}
这给了我以下结果:
对我来说没有意义的是我的窗口尺寸为400 X 400,但坐标为:glVertex2f(0, 0)
和glVertex2f(0, .25)
。从窗口中心左右画一条线到窗口高度的80%左右。我有一些猜测:
我知道我对glTranslatef(0, 0, -1);
的来电将原点设置为全局坐标(0, 0, -1)
令我感到困惑的是:
.25
是否对应于高度的25%?如果您需要更多信息,请与我们联系。
答案 0 :(得分:0)
让我试着回答你的问题:
您正在使用模型视图(world to view)系统。因此,您开始在世界坐标中建模并将其转换为视图坐标。因此,glTranslatef正在将您的世界1个坐标点移离摄像机。
在openGL中执行的操作与Windows坐标的关系微弱。所以,0.25真的意味着0.25 to openGL,仅此而已。这意味着您可以将任何语义固定到点,例如米,公里,毫米等。 openGL缓冲区和窗口坐标之间的相关性是在函数gluPerspective中建立的,其中它基本上表示你的世界区域必须映射到你的窗口坐标系。第二个函数glViewport只说明了如何将这个地图转换为你的窗口坐标。在您的情况下,您告诉您使用所有窗口。
正如我之前所说,你需要操纵你的gluPerspective来控制openGL世界将多少映射到你的窗口坐标。为此,您可以更改透视的角度。更大的角度,更多的openGL区域将被映射,您将获得缩小效果。较小的角度,较少的openGL区域将被映射,并且您将获得放大效果