openGL 3 在空间中绘图2

2.1 直线点画(就是虚线)

启用点画功能:

glEnable(GL_LINE_STIPPLE); //调用enable所启用的任何一个功能/特性都可以用一个对应的glDisable来取消。

然后用glLineStipple函数创建这种模式,以便进行画线:

void glLineStipple(GLint factor, GLushort pattern);

pattern参数为一个16位的值,它指定了一个模式,来画直线。它的每一个位都表示线段的一部分,或者处于打开的状态或者关闭。在缺省的状态下每一个位都对应了一个像素,但factor参数则是作为一个乘法因子,用于增加模式的宽度。例如将factor设置为5就表示模式中的每一个位对应的是5个像素。另外模式的第0位(最低有效位)首先用于指定直线。

void myFunc() {
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f, 0.0f, 0.0f);
    GLfloat y;
    GLint factor = 1;
    GLshort pattern = 0x5555;
    glEnable(GL_LINE_STIPPLE);
    for (y = -0.5f; y < 0.5f; y += 0.1f) {
        glLineStipple(factor, pattern);
        glBegin(GL_LINES);
        glVertex2f(-0.5f, y);
        glVertex2f(0.5f, y);
        glEnd();
        factor++;
    }
    glFlush();
}

 

2.2 在3D空间绘制三角形

void myFunc() {
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f, 0.0f, 0.0f);
    glBegin(GL_TRIANGLES);
    glVertex2f(0.0f, 0.0f);
    glVertex2f(0.5f, 0.5f);
    glVertex2f(1.0f, 0.0f);
    
    glVertex2f(-0.5f, 0.0f);
    glVertex2f(-1.0f, 0.5f);
    glVertex2f(-0.25f, 0.0f);
    glEnd();

    glFlush();
}

 

在一个场景中,使所有的多边形保持环绕的一致,并使用正面多边形来绘制所有实心物体的外表是是十分重要的。

 

2.3 三角形带

使用GL_TRIANGLE_STRIP图元,可以绘制一串相连的三角形。每次只需要再指定一个顶点。

 

2.4 三角形扇

可以使用GL_TRIANGLE_FAN来创建一组围绕一个中心点的相连的三角形。

 

2.5 利用三角形扇来绘制一个在空间中可以旋转的3D物体

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

GLfloat pi = 3.1415f, x = 0.0f, y = 0.0f, r = 0.5f, a=0.0f;
GLfloat xRot = 0.0f, yRot = 0.0f;

void myFunc() {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glPushMatrix();
    glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    glRotatef(yRot, 0.0f, 1.0f, 0.0f);
    
    glBegin(GL_TRIANGLE_FAN);
    glVertex3f(0.0f, 0.0f, 1.0f);
    for (int i = 0; i <= 20; i++) {
        a = (2 * pi / 20)*i;
        x = cos(a)*r;
        y = sin(a)*r;
        if (i % 2 == 0) glColor3f(1.0f, 0.0f, 0.0f);
        else glColor3f(0.0f, 1.0f, 0.0f);
        glVertex2f(x, y);
        i++;
        a = (2 * pi / 20)*i;
        x = cos(a)*r;
        y = sin(a)*r;
        if (i % 2 == 0) glColor3f(1.0f, 0.0f, 0.0f);
        else glColor3f(0.0f, 1.0f, 0.0f);
        glVertex2f(x, y);
    }
    glEnd();
    glPopMatrix();
    glFlush();
}

void getKey(GLint key, GLint x, GLint y) {
    switch (key)
    {
    case GLUT_KEY_UP:
        xRot -= 5.0f;
        break;
    case GLUT_KEY_DOWN:
        xRot += 5.0f;
        break;
    case GLUT_KEY_LEFT:
        yRot -= 5.0F;
        break;
    case GLUT_KEY_RIGHT:
        yRot += 5.0f;
        break;
    default:
        break;
    }
    if (xRot > 356.0f) xRot = 0.0f;
    if (xRot < -1.0f) xRot = 355.0f;
    if (yRot > 356.0f) yRot = 0.0f;
    if (yRot < -1.0f) yRot = 355.0f;
    glutPostRedisplay();
}

int main() {
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutCreateWindow("");
    glutSpecialFunc(getKey);
    glutDisplayFunc(myFunc);
    glutMainLoop();
    return 0;
}

 

posted on 2016-10-19 19:58  seapx  阅读(304)  评论(0)    收藏  举报

导航