2015-01-06 122 views
0

我有一個3D模型,用戶可以通過它控制退出迷宮。我想在模特頭上畫一個矩形,其中的想法是展示他的「能量」。長方形在任何時候都應該高於頭頂。Opengl在移動3D場景中繪製2D矩形

我到目前爲止這樣的代碼:

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

它doensn't沒有出現紅色,也沒有在正確的位置..

+0

查看答案,投票給那些幫助你的人,然後點擊解決問題的人旁邊的複選框。 – karlphillip

回答

1
  1. 項目使用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; 
} 
+0

我試過使用這段代碼,但是我得到一個空白窗口:/ –

+1

適用於我。我看到一個立方體旋轉的白色線框和一個紅角粘在一個角上。 – karlphillip

0

最簡單的方式來實現這一目標很可能是一個有一個平面,並將其放置在正確的模型,然後轉動旋轉攝像頭。唯一的問題可能是能量棒在這種情況下受到視角的影響,並且擺脫了需要在鄰域內渲染的問題。但是,如果你對改變外觀的看法很好,那應該是一個足夠好的解決方案。