Opengl在移动的3D场景中绘制2D矩形

时间:2015-01-06 20:09:06

标签: c++ opengl 3d

我有一个带有3d模型的3D迷宫,用户可以控制它来退出迷宫。我想在模特头顶部画一个矩形,其中的想法是展示他的“能量”。矩形始终高于他的头部。

到目前为止我有这个代码:

glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective
glColor3f(1, 0, 0);
glTranslatef(modelo.objecto.pos.x, modelo.objecto.pos.y+1, modelo.objecto.pos.z);

glBegin(GL_QUADS); //Begin quadrilateral coordinates
//Trapezoid
glVertex2f(0, 0);
glVertex2f(2, 0);
glVertex2f(2, .5);
glVertex2f(0, .5);
glEnd(); //End quadrilateral coordinates

结果如下:Result

它既不会出现红色也不会出现在正确的位置。

2 个答案:

答案 0 :(得分:1)

  1. 使用gluProject()或类似内容将模型顶部的世界空间坐标投影到窗口空间。
  2. 将投影矩阵交换为正交
  3. 以#1中获得的窗口空间坐标为中心绘制四边形。
  4. 所有在一起:

    #include <GL/glut.h>
    
    float angle = 0;
    void timer( int extra )
    {
        angle += 0.5;
    
        glutPostRedisplay();
        glutTimerFunc( 16, timer, 0 );
    }
    
    void display(void)
    {
        const double w = glutGet( GLUT_WINDOW_WIDTH );
        const double h = glutGet( GLUT_WINDOW_HEIGHT );
        const double ar = w / h;
    
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective( 60.0, ar, 0.1, 100.0 );
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef( 0, 0, -4 );
        glRotatef( angle, 0.1, 0.5, 0.3 );
    
        glColor3ub( 255, 255, 255 );
        glutWireCube( 2.0 );
    
    
        GLdouble modelview[16];
        glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
        GLdouble projection[16];
        glGetDoublev( GL_PROJECTION_MATRIX, projection ); 
        GLint viewport[4];
        glGetIntegerv( GL_VIEWPORT, viewport ); 
    
        double x, y, z;
        gluProject( 1, 1, 1, modelview, projection, viewport, &x, &y, &z );
    
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho( 0, w, 0, h, -1, 1 );
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    
        glTranslatef( x, y, 0 );
        glScalef( 10, 10, 1 );
        glBegin( GL_QUADS );
        glColor3ub( 255, 0, 0 );
        glVertex2i( -1, -1 );
        glVertex2i(  1, -1 );
        glVertex2i(  1,  1 );
        glVertex2i( -1,  1 );
        glEnd();
    
        glutSwapBuffers();
    }
    
    int main( int argc, char **argv )
    {
        glutInit( &argc, argv );
        glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );
        glutInitWindowSize( 800, 600 );
        glutCreateWindow( "GLUT" );
        glutDisplayFunc( display );
        glutTimerFunc( 0, timer, 0 );
        glutMainLoop();
        return 0;
    }
    

答案 1 :(得分:0)

实现这一目标的最简单方法可能是拥有一个平面并将其放置在模型上方,然后将旋转转向相机。唯一的问题可能是能量条在这种情况下受到透视的影响,并且摆脱了你需要在正交中渲染的能量条。但如果你改变它的外观很好,那应该是一个足够好的解决方案。