簡體   English   中英

在移動3D場景中進行Opengl Draw 2D矩形

[英]Opengl Draw 2D Rectangle in a Moving 3D scene

我有一個帶有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

結果是: 結果

它既不會出現紅色,也不會出現在正確的位置。

  1. 使用gluProject()或類似工具將模型頭部頂部的世界空間坐標gluProject()到窗口空間中。
  2. 將投影矩陣交換為正交矩陣
  3. 以#1中獲取的窗口空間坐標為中心繪制四邊形。

全部一起:

#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;
}

最簡單的方法可能是將飛機放到模型上,然后將旋轉方向轉到相機。 唯一的問題可能是,在這種情況下,能量條會受到透視的影響,而要消除它,您將需要在正交中進行渲染。 但是,如果您可以改變外觀,可以很好地解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM