计算机图形学OpenGL实验——实现三维空间、视野方向转换

计算机图形学实验,用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(
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值