opengl 绘制3D动物:蜜蜂蚊子+蜘蛛+鱼+鸡+雪宝宝+机器人

一、开发环境说明

  • 操作系统:windows
  • 开发软件:Visual Studio 2017
  • 编程语言:基于控制台下的opengl
  • 用到的库: glut

opengl环境配置可参照上一篇博客:控制台+OPENGL配置说明[GLUT篇]

二、运行效果演示如下

三、内容介绍

  • 绘制多关节动物、人物模型
  • 有光照效果
  • 有动画效果,各个关节可以运动
  • 要求绘制的模型逼真、形象,层次建模;
  • 鼠标键盘可以交互

四、模型展示

1、蚊子
  • 运行结果截图
    在这里插入图片描述
  • 主要代码如下
void display()
{ 
	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空颜色深度缓冲
	glMatrixMode(GL_MODELVIEW);//模型矩阵
	glLoadIdentity();//矩阵单位化
	gluLookAt(0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
	glPushMatrix();
	glTranslatef(pos[0],pos[1],0);//平移
	glPushMatrix();
	glTranslatef(-100,150,-600);
	wenzi();//第一只蚊子
	glPopMatrix();

	glPushMatrix();
	glTranslatef(100,0,-500);//平移
	wenzi();//第二只蚊子
	glPopMatrix();

	glPushMatrix();
	glTranslatef(-200,0,-500);//平移
	wenzi();//第三只蚊子
	glPopMatrix();
	glPopMatrix();
	glutSwapBuffers();
}
2、雪宝宝
  • 运行结果截图
    在这里插入图片描述
  • 主要代码如下
void drawCat(float cx, float cy, float cz)//绘制雪宝宝
{
	glPushMatrix();
	glTranslatef(cx, cy, cz);
	glRotatef(angle, 0.0, 1.0, 0.0);
	drawMain();//头

	glPushMatrix();
	glRotatef(leftAngle, 0.0, 1.0, 0.0);
	drawLeftHand();//左手
	glPopMatrix();

	glPushMatrix();
	glRotatef(rightAngle, 0.0, 1.0, 0.0);
	drawRightHand();//右手
	glPopMatrix();

	glPushMatrix();
	glRotatef(leftAngle2, 1.0, 0.0, 0.0);
	drawLeftLeg();//左腿
	glPopMatrix();

	glPushMatrix();
	glRotatef(rightAngle2, 1.0, 0.0, 0.0);
	drawRightLeg();//右腿
	glPopMatrix();
	glPopMatrix();
}
3、鱼
  • 运行结果截图
    在这里插入图片描述
  • 主要代码如下
void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空缓冲
	glMatrixMode(GL_MODELVIEW);//模型矩阵
	glLoadIdentity();
	gluLookAt(-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//视角矩阵
	glScaled(0.7, 0.7, 0.7);//缩放
	glTranslatef(0, 0, lineLocation);//平移
	glRotatef(theta[13], 0.0, 1.0, 0.0);//旋转
	fish();//绘制鱼
	glutSwapBuffers();//交互缓存
}
4、蜘蛛
  • 运行结果截图
    在这里插入图片描述
  • 主要代码如下
void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);//模型矩阵
	glLoadIdentity();//单位矩阵
	gluLookAt(-1, 1, 1, 0, 0, 0, 0.0, 1.0, 0.0);//视角矩阵
	glRotatef(theta[0], 0.0, 1.0, 0.0);//旋转
	spider();//绘制蜘蛛
	glutSwapBuffers();//交互缓存
}
5、小鸡
  • 运行结果截图
    在这里插入图片描述
  • 主要代码如下
void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);//视角矩阵
	glTranslatef(m_chickenPos[0], m_chickenPos[1], -100);//平移
	glRotatef(theta[0], 1.0, 0.0, 0.0);//绕X轴旋转
	glRotatef(theta[1], 0.0, 1.0, 0.0);//绕Y轴旋转
	glRotatef(theta[2], 0.0, 0.0, 1.0);//绕Z轴旋转
	chicken();//绘制小鸡函数
	glutSwapBuffers();//交互前后缓存

}
6、机器人
  • 运行结果截图
    在这里插入图片描述
  • 主要代码如下
void display(){
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);//模型矩阵
    glLoadIdentity();//单位化
    gluLookAt(0.2, 0.2, 0.4, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0);//视角矩阵
    human();//绘制人
    glutSwapBuffers();//交互前后缓存
}
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用OpenGL和SOIL库绘制茶壶、泳圈和长方体,并添加灯光、纹理和阴影的完整代码: ```c++ #include <GL/glut.h> #include <SOIL/SOIL.h> // 定义纹理ID GLuint texTeapot, texRing, texBox; // 定义材质 GLfloat matTeapot[] = { 0.5, 0.5, 0.5, 1.0 }; GLfloat matRing[] = { 0.5, 0.5, 0.5, 1.0 }; GLfloat matBox[] = { 0.5, 0.5, 0.5, 1.0 }; // 定义光源 GLfloat lightPos[] = { 0.0, 5.0, 5.0, 1.0 }; GLfloat lightAmb[] = { 0.2, 0.2, 0.2, 1.0 }; GLfloat lightDif[] = { 0.8, 0.8, 0.8, 1.0 }; GLfloat lightSpc[] = { 0.5, 0.5, 0.5, 1.0 }; // 定义阴影 GLfloat shadowMat[16] = { 0.0 }; GLfloat groundPlane[4] = { 0.0, 1.0, 0.0, 0.0 }; GLfloat groundShadow[4][4] = { 0.0 }; // 绘制茶壶 void drawTeapot() { glBindTexture(GL_TEXTURE_2D, texTeapot); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matTeapot); glutSolidTeapot(1.0); } // 绘制泳圈 void drawRing() { glBindTexture(GL_TEXTURE_2D, texRing); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matRing); glutSolidTorus(0.2, 1.0, 20, 20); } // 绘制长方体 void drawBox() { glBindTexture(GL_TEXTURE_2D, texBox); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matBox); glutSolidCube(1.0); } // 绘制阴影 void drawShadow() { glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glPushMatrix(); glMultMatrixf((GLfloat *)groundShadow); glColor3f(0.0, 0.0, 0.0); drawTeapot(); drawRing(); drawBox(); glPopMatrix(); glEnable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); } // 初始化 void init() { // 加载纹理 texTeapot = SOIL_load_OGL_texture("teapot.jpg", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); texRing = SOIL_load_OGL_texture("ring.jpg", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); texBox = SOIL_load_OGL_texture("box.jpg", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); // 设置纹理参数 glBindTexture(GL_TEXTURE_2D, texTeapot); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, texRing); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, texBox); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 设置材质 glMaterialf(GL_FRONT, GL_SHININESS, 128.0); // 设置光源 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif); glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpc); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); // 设置阴影 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -4.0); glGetFloatv(GL_MODELVIEW_MATRIX, shadowMat); glLoadIdentity(); glTranslatef(0.0, -1.0, 0.0); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPushMatrix(); glMultMatrixf((GLfloat *)shadowMat); glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *)groundShadow); glPopMatrix(); glDisable(GL_BLEND); glEnable(GL_LIGHTING); } // 显示回调函数 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 绘制阴影 drawShadow(); // 绘制物体 glEnable(GL_TEXTURE_2D); drawTeapot(); drawRing(); drawBox(); glDisable(GL_TEXTURE_2D); glutSwapBuffers(); } // 窗口大小改变回调函数 void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -4.0); } // 主函数 int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("OpenGL Demo"); glutDisplayFunc(display); glutReshapeFunc(reshape); init(); glutMainLoop(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值