【问题标题】:opengl draw line height of windowopengl绘制窗口的行高
【发布时间】:2013-08-04 00:18:57
【问题描述】:

我想知道如何根据封闭窗口的尺寸绘制一条线的长度。请注意,我使用的是 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) 让我感到困惑的是:

  1. -1 如何对应于将图像移动那么远?
  2. 第二个坐标中的.25是否对应高度的25%?
  3. 从 (WINDOW_LENGTH/2, 0) 到 (WINDOW_LENGTH/2, WINDOW_HEIGHT/2) 绘制一条线的代码是什么样的,即从窗口底部中心到窗口中心的线。

如果您需要更多信息,请告诉我。

【问题讨论】:

  • .25 绝对不是窗口高度的 25%...我现在不知道。

标签: c++ opengl window glut


【解决方案1】:

让我试着回答你的问题:

  1. 您正在模型视图(世界视图)系统中工作。因此,您开始在世界坐标中建模并将其转换为视图坐标。因此,glTranslatef 正在将您的世界 1 坐标点从摄像机移开。

  2. 您在 openGL 中所做的事情与您的窗口坐标关系不大。所以,0.25 对 openGL 来说真的意味着 0.25,仅此而已。这意味着您可以为点建立任何语义,例如米、公里、毫米等。 openGL 缓冲区和窗口坐标之间的相关性在函数 gluPerspective 中得到了证实,其中基本上说,您的世界中必须映射到您的窗口坐标系的区域。第二个函数,glViewport 仅说明此地图将如何转换为您的窗口坐标。就您而言,您是在告诉使用所有窗口。

  3. 正如我之前所说,您需要操纵 gluPerspective 来控制多少 openGL 世界将映射到您的窗口坐标。为此,您需要更改透视的角度。更大的角度,将映射更多的 openGL 区域,并且您会获得缩小的效果。较小的角度,较少的openGL区域将被映射,并且您将获得放大效果

【讨论】:

  • For 1) 你能解释一下 -1 是如何做到这一点的吗?对于 2) 你能否更具体地了解我使用的代码以及它是如何产生这种效果的?你或任何人能给我建议gluperspectiveglViewport的参数吗?
  • 它的距离不远,与角度和相机位置有关。做一个小测试。尝试将角度 (45) 更改为 15,然后更改为 75,然后查看效果。也许这个数字可以帮助(toldo.info/roberto/LaboratorioGrafica/Slides/images/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多