2015-01-06 168 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

最简单的方式来实现这一目标很可能是一个有一个平面,并将其放置在正确的模型,然后转动旋转摄像头。唯一的问题可能是能量棒在这种情况下受到视角的影响,并且摆脱了需要在邻域内渲染的问题。但是,如果你对改变外观的看法很好,那应该是一个足够好的解决方案。