计算机图形学实验,用OpenGL实现三维空间,绘制三维房间、家具、房屋建筑等。
用到的OpenGL 函数
glColor3f(blue); //设置颜色
glutSolidCube(size);//绘制正方体
glVertex3f(x, y, z);//设置点坐标
glLightfv(a,b,c); //设置光源
glTranslatef(x, y, z`)`;//平移函数
glScalef(x, y, z); //放大/缩小函数
glRotatef(angle, x, y, z);//绕轴旋转函数
glutSolidSphere(radius, slices, stacks);//绘制球体
glBegin(图形类型) 与 glEnd(void)
在glBegin(arg)的参数部分选择要绘制的图形类型; 在glBegin()与glEnd()之间添加坐标点。比如绘制三角形,就选择glBegin()的参数为GL_TRIANGLES, glVertex3f(x, y, z)添加三角形三个顶点的坐标,末尾加上glEnd().这种代码绘制的图形一般是一个三维空间中的平面图形。
glBegin(GL_TRIANGLES);
glVertex3f(x1, y1, z1);
glVertex3f(x2, y2, z2);
glVertex3f(x3, y3, z3);
glEnd();
glPushMatrix() 与 glPopMatrix()
在glPushMatrix() 与 glPopMatrix() 之间添加绘制基本平面图形,通过组合、平移、放大缩小就能轻易的实现复杂三维视图。
比如: 用glutSolidCube(1);绘制一个边长为一个单位的立方体,这个立方体的中心坐标为(t0, 0, 0);
进行平移、放大:
glPushMatrix();
glTranslatef(1, 2, 3)
glScalef(1,1,3);
glPopMatrix();
这样立方体的中心位置的坐标变成了(1,2,3),而且长宽高分别变成了1,1,3个单位长度。
代码
//地板黑白纹理
//产生纹理
void makeCheckImages(void)
{
int i, j, c;
for (i = 0; i < checkImageHeight; i++) {
for(j = 0; j < checkImageWidth; j++) {
c = (((( i & 0x8) == 0) ^ ((j & 0x8)) == 0)) * 255;
if(c == 255)
{
checkImage[i][j][0] = (GLubyte) 180;
checkImage[i][j][1] = (GLubyte) 180;
checkImage[i][j][2] = (GLubyte) 180;
checkImage[i][j][3] = (GLubyte) 255;
}
else
{
checkImage[i][j][0] = (GLubyte) c;
checkImage[i][j][1] = (GLubyte) c;
checkImage[i][j][2] = (GLubyte) c;
checkImage[i][j][3] = (GLubyte) 255;
}
}
}
}
//机器人
void people(void)
{
glColor3f(blue);
glutSolidCube(2); //身体
glColor3f(white);
glPushMatrix(); //头
glTranslatef(0, 1.5, 0);
glutSolidCube(1);
glPopMatrix();
glColor3f(black);
glLineWidth(3);
glBegin(GL_LINES);
glVertex3f(-0.2 ,1.75, 0.52);
glVertex3f(-0.3 ,1.75, 0.52);
glVertex3f( 0.2 ,1.75, 0.52);
glVertex3f( 0.3 ,1.75, 0.52);
glVertex3f( 0.1 ,1.25, 0.52);
glVertex3f(-0.1 ,1.25, 0.52);
glEnd();
glLineWidth(1);
glColor3f(brown);
glPushMatrix(); //腿
glTranslatef(-0.7, -2.25, 0);
glScalef(0.5, 2.5, 0.5);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(0.7, -2.25, 0);
glScalef(0.5, 2.5, 0.5);
glutSolidCube(1);
glPopMatrix();
//手
glPushMatrix();
glTranslatef(0, 0.25, 0);
glPushMatrix();
glTranslatef(-1.25, 0, 0);
glScalef(1, 0.5, 0.5);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glRotated(pep_agl, 1, 0, 0);
glTranslatef(-1.75, -0.75, 0);
glScalef(0.5, 2, 0.5);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(1.25, 0, 0);
glScalef(1, 0.5, 0.5);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glRotated(-1 * pep_agl, 1, 0, 0);
glTranslatef( 1.75, -0.75, 0);
glScalef(0.5, 2, 0.5);
glutSolidCube(1);
glPopMatrix();
glPopMatrix();
}
void draw_people(void){
glPushMatrix();
glTranslatef(4, -6.5, -5);
people();
glPopMatrix();
}
//绘制树木
void draw_tree(void)
{
glPushMatrix();
glScalef(0.2, 0.2, 0.15);
glTranslatef(120, -60, -450);
//树干
glColor3f(brown);
constract(60,10,390,15,70,15);
build();
//树叶
glColor3f(hgreen);
glTranslatef(60,70,400);
glutSolidSphere(25.0, 20, 20); //球1
glTranslatef(20,0,0);
glutSolidSphere(25.0, 20, 20); //球2
glTranslatef(-10,0,-10);
glutSolidSphere(25.0, 20, 20); //球3
glTranslatef(0,0,20);
glutSolidSphere(25.0, 20, 20); //球4
glTranslatef(0,10,-10);
glutSolidSphere(25.0, 20, 20); //球4
glPopMatrix();
}
//草坪路
void draw_road(int x)
{
glColor3f(brown);
for (int i = 0; i < x; ++i) {
glPushMatrix();
glTranslatef(0, 0, i * 5);
constract(-5, -10, 0, 10, 0.1, 3.5);
build();
glPopMatrix();
}
}
//NUAA教学楼
void NUAA(void)
{
glMaterialfv(GL_FRONT, GL_AMBIENT, matWhite);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matWhite);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glPushMatrix();
glTranslatef(0, 0, 150);
glRotated(180, 0, 1, 0);
glColor3f(brown);
constract(-15, 20, 0, 30, 70, -30);
build();
glColor3f(hgray);
constract(-35, -10, 0, 70, 30, -30);
build();
glColor4f(white, 0.35);
for (int i = 0; i < 9; ++i) {
glPushMatrix();
glTranslatef(0, 7 * i, 0);
constract(-12, 21, 0.2, 10, 6, -0.2);
build();
constract(2, 21, 0.2, 10, 6, -0.2);
build();
glPopMatrix();
}
glColor4f(white, 0.35);
constract(-30, -5, 0.2, 25, 20, -0.2);
build();
constract( 5, -5, 0.2, 25, 20, -0.2);
build();
glPushMatrix();
glTranslatef(-13, 84, 0.1);
glScalef(0.04, 0.05, 2);
glColor3f(red);
glLineWidth(5);
glutStrokeCharacter(GLUT_STROKE_ROMAN, 'N');
glutStrokeCharacter(GLUT_STROKE_ROMAN, ' ');
glutStrokeCharacter(GLUT_STROKE_ROMAN, 'U');
glutStrokeCharacter(GLUT_STROKE_ROMAN, ' ');
glutStrokeCharacter(GLUT_STROKE_ROMAN, 'A');
glutStrokeCharacter(GLUT_STROKE_ROMAN, ' ');
glutStrokeCharacter(GLUT_STROKE_ROMAN, 'A');
glLineWidth(1);
glPopMatrix();
glPopMatrix();
}
//房子
void house(void)
{
glMaterialfv(GL_FRONT, GL_AMBIENT, matWhite);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matWhite);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glPushMatrix();
glColor3f(brown);
constract(-15, -10, 0, 30, 70, -30);
build();
glColor4f(white, 0.35);
for (int i = 0; i < 9; ++i) {
glPushMatrix();
glTranslatef(0, 7 * i, 0);
constract(-12, -9, 0.2, 10, 6, -0.2);
build();
constract( 2, -9, 0.2, 10, 6, -0.2);
build();
glPopMatrix();
}
glPopMatrix();
}
//太阳
//太阳
glPushMatrix();
glColor3f(gold);
glTranslatef(0, 95, 0);
glutSolidSphere(5.0, 20, 20);
glPopMatrix(