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; }

浙公网安备 33010602011771号