如何在openGL中将点标记为矩形?

时间:2018-03-24 11:27:19

标签: c++ opengl

尝试创建一个矩形并使用A,B,C,D标记角点。我成功地绘制了一个矩形,但无法标记角落。

到目前为止,这是源代码:

#include <GL/glut.h>
#include <stdlib.h>

/* GLUT callback Handlers */
static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBegin(GL_QUADS);
        glColor3d(1,0,0);
        glVertex3f(-1,-1,-10);
        glColor3d(1,1,0);
        glVertex3f(1,-1,-10);
        glColor3d(1,1,1);
        glVertex3f(1,1,-10);
        glColor3d(0,1,1);
        glVertex3f(-1,1,-10);
    glEnd();
    glutSwapBuffers();
}


static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;
    }
    glutPostRedisplay();
}

static void idle(void)
{
    glutPostRedisplay();
}

/* Program entry point */
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT quadPoly");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(0,0,0,0);

    glutMainLoop();

    return EXIT_SUCCESS;
}

如何标记矩形中的角?

1 个答案:

答案 0 :(得分:0)

  

如何标记矩形中的角落?

过剩的自由功能glutStrokeCharacter呈现出一个笔画角色。通过绘制线基元来渲染描边字符。字体中字符的最大顶部高度为119.05个单位;底部的最小值为33.33单位。字符的宽度可以通过glutStrokeWidth获得。该角色将渲染到当前模型视图投影矩阵的原点。

以下函数将大小为h的字符呈现为xyz。可以通过lefttop

设置对齐方式
void LabelStroke(char c, float h, bool left, bool top, float x, float y, float z)
{
    float scale = h / ( 119.05f + 33.33f );
    float xo = x;
    float yo = y;
    if ( left )
    {
        int w = glutStrokeWidth(GLUT_STROKE_ROMAN, c );
        xo -= h * (float)w / ( 119.05f + 33.33f );
    }
    if ( top )
        yo -= h * (float)119.05f / ( 119.05f + 33.33f );

    glPushMatrix();
    glTranslatef(xo, yo, z);
    glScalef(scale, scale, scale); 
    glutStrokeCharacter(GLUT_STROKE_ROMAN, c); 
    glPopMatrix();
}  

以某种方式使用该功能:

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBegin(GL_QUADS);
        glColor3d(1,0,0);
        glVertex3f(-1,-1,-10);
        glColor3d(1,1,0);
        glVertex3f(1,-1,-10);
        glColor3d(1,1,1);
        glVertex3f(1,1,-10);
        glColor3d(0,1,1);
        glVertex3f(-1,1,-10);
    glEnd();

    float size = 0.5f;
    float offsl = size * 0.7f;
    glColor3d(1.0, 1.0, 1.0);
    LabelStroke( 'A', size, true,  true,  -1.0f, -1.0f, -10.0f );
    LabelStroke( 'B', size, false, true,   1.0f, -1.0f, -10.0f );
    LabelStroke( 'C', size, false, false,  1.0f,  1.0f, -10.0f );
    LabelStroke( 'D', size, true,  false, -1.0f,  1.0f, -10.0f );

    glutSwapBuffers();
}

查看预览:


使用glut库函数glutBitmapCharacter,可以呈现位图字符。通过绘制像素(例如glDrawPixels)来渲染位图字符。可以通过glRasterPosglBitmap分别设置和移动角色的位置:

void LabelBitmap( char c, bool left, bool top, float x, float y, float z  )
{
    int w = glutBitmapWidth( GLUT_BITMAP_TIMES_ROMAN_24, c );
    glRasterPos3f( x, y, z );
    glBitmap(0, 0, 0, 0, left ? -w : 0, top ? -24 : 0, NULL);
    glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, c); 
}

void display(void)
{
    .....

    glColor3d(1.0, 1.0, 1.0);
    LabelBitmap( 'A', true,  true,  -1.0f, -1.0f, -10.0f );
    LabelBitmap( 'B', false, true,   1.0f, -1.0f, -10.0f );
    LabelBitmap( 'C', false, false,  1.0f,  1.0f, -10.0f );
    LabelBitmap( 'D', true,  false, -1.0f,  1.0f, -10.0f );

    .....
}

注意,在调用glColor之前,必须设置用于渲染角色的当前颜色(glRasterPos)。 当前的栅格位置还包括一些相关的颜色数据和纹理坐标。调用glRasterPos时,当前颜色和纹理坐标将替换存储在当前栅格位置的关联数据中的颜色和纹理坐标。

预览: