繁体   English   中英

如何在openGL中标记指向矩形?

[英]How to label points to a rectangle in openGL?

尝试创建一个Rectangle并使用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;
}

如何在矩形中标记角?

如何在矩形中标记角?

glut自由函数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 );

    .....
}

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

预习:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM