图形学opengl作业-简单机器人&&我的世界简化版

来源:互联网 发布:centos加固 编辑:程序博客网 时间:2024/05/21 18:50


凭借着图形学的课,这学期有幸接触了opengl,稍微搞了一些东西,也算入了个门。

下面的是参考这位大牛,在原作的基础上增添了行走操作、肢体旋转、复位、背景音乐、武器选择。

直接看代码就行,和上一篇一样没什么高深的算法,不过对于初学者来说要花时间熟悉语法。

背景音乐用的fmod,fmod用多个声道时网上没什么比较清晰的教程,建议用bass。

(刚开始为了找解决方案,还特地买了个mp3转mid转换器,这软件是可以用的,就是还是解决不了根本问题,顺便贴出来分享下click here~)

本篇两个作业用的vs2013,一些库和头文件都需要自己配。

先上几个效果图吧,一大坨代码附在最后。(大神请绕道)





-----------------------------------完结分割线----------------------------------------------

接下来就是厉害的东西了,主笔是我同组的另外两位大神,我是最水的一个。

一些比较难的碰撞检测、阴影效果、地形管理(地形是无限延伸的)都是他们的成果,除此之外还有重力设置方块渲染相机aabb包围盒啥的,框架的搭建也是属于继承那种偏向于项目的东西,我是第一次接触这些东西,就不班门弄斧了,就做了个音效界面还被嫌弃T T。。


这是我上大学以来见过的最牛逼的东西,老实说刚开始听到ys说要做这个时我是震惊的,没想到真的做出来了2333666。。

对我来说也没什么别的想法了,能和这些大神合作本身就是一种幸运。


下面是效果图,由于我最水,就不上代码了,需要的私聊我吧。











-----------------------------------完结分割线----------------------------------------------

最后是一大坨robot代码:

#include <gl/glut.h>#include <stdlib.h>#include <stdio.h>#include "fmod.h"// 音频库的头文件#pragma comment(lib, "fmodvc.lib")// 把音频库加入到链接器中#define SOLID 1#define WIRE 2#define LEFT 1#define RIGHT 2FSOUND_STREAM *mp3back;// 背景音乐 *.mp3格式int moveX;int spinX = 0;int larm = 0, rarm = 0;bool flag = false;//判断左右bool limb = true;//判断肢体是上身还是下身,默认上身bool flag0 = false;//标记是否复位float dis = 0;float step = 0;int weapon = 0;void init(){//定义光源的颜色和位置GLfloat ambient[] = { 0.5, 0.8, 0.1, 0.1 };GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat position[] = { -80.0, 50.0, 25.0, 1.0 };//选择光照模型GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };GLfloat local_view[] = { 0.0 };glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);//设置环境光glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);//设置漫射光glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);//设置光源位置glLightfv(GL_LIGHT0, GL_POSITION, position);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);//启动光照glEnable(GL_LIGHTING);//启用光源glEnable(GL_LIGHT0);}//画球void drawBall(double R, double x, double y, double z, int MODE) {glPushMatrix();glTranslated(x, y, z);if (MODE == SOLID) {glutSolidSphere(R, 20, 20);}else if (MODE == WIRE) {glutWireSphere(R, 20, 20);}glPopMatrix();}//画旋转球void RdrawBall(double R, double x, double y, double z, int MODE, int pos, int degree)//pos判断左右{glPushMatrix();if (pos == LEFT){if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0){glRotatef((GLfloat)larm, 1.0, 0.0, 0.0);}else flag0 = false;}else if (pos == RIGHT){if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0){glRotatef((GLfloat)rarm, 1.0, 0.0, 0.0);}else flag0 = false;}glTranslated(x, y, z);if (MODE == SOLID){glutSolidSphere(R, 20, 20);}else if (MODE == WIRE){glutWireSphere(R, 20, 20);}glPopMatrix();}//画旋转半球void RdrawHalfBall(double R, double x, double y, double z, int MODE, int pos, int degree){glPushMatrix();if (pos == LEFT){if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0){glRotatef((GLfloat)larm, 1.0, 0.0, 0.0);}else flag0 = false;}else if (pos == RIGHT){if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0){glRotatef((GLfloat)rarm, 1.0, 0.0, 0.0);}else flag0 = false;}glTranslated(x, y, z);GLdouble eqn[4] = { 0.0, 1.0, 0.0, 0.0 };glClipPlane(GL_CLIP_PLANE0, eqn);glEnable(GL_CLIP_PLANE0);if (MODE == SOLID){glutSolidSphere(R, 20, 20);}else if (MODE == WIRE){glutWireSphere(R, 20, 20);}glDisable(GL_CLIP_PLANE0);glPopMatrix();}//画旋转半球0号void RdrawHalfBall0(double R, double x, double y, double z, int MODE, int pos, int degree){glPushMatrix();if (pos == LEFT){if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0){glRotatef((GLfloat)larm, 1.0, 0.0, 0.0);}else flag0 = false;}else if (pos == RIGHT){if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0){glRotatef((GLfloat)rarm, 1.0, 0.0, 0.0);}else flag0 = false;}glRotatef(90.0, 1.0, 0.0, 0.0);glTranslated(x, y, z);GLdouble eqn[4] = { 0.0, 1.0, 0.0, 0.0 };glClipPlane(GL_CLIP_PLANE0, eqn);glEnable(GL_CLIP_PLANE0);if (MODE == SOLID){glutSolidSphere(R, 20, 20);}else if (MODE == WIRE){glutWireSphere(R, 20, 20);}glDisable(GL_CLIP_PLANE0);glPopMatrix();}//画长方体void drawSkewed(double l, double w, double h, double x, double y, double z, int MODE){glPushMatrix();glScaled(l, w, h);glTranslated(x, y, z);if (MODE == SOLID){glutSolidCube(1);}else if (MODE == WIRE){glutWireCube(1);}glPopMatrix();}//画旋转长方体void RdrawSkewed(double l, double w, double h, double x, double y, double z, int MODE, int pos, int degree, bool limb){glPushMatrix();if (pos == LEFT){if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0 && limb){glRotatef((GLfloat)larm, 1.0, 0.0, 0.0);}//else flag0 = false;}else if (pos == RIGHT){if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0 && limb){glRotatef((GLfloat)rarm, 1.0, 0.0, 0.0);}else flag0 = false;}glScaled(l, w, h);glTranslated(x, y, z);if (MODE == SOLID){glutSolidCube(1);}else if (MODE == WIRE){glutWireCube(1);}glPopMatrix();}//画旋转十二面体void RdrawDodecahedrond(double l, double w, double h, double x, double y, double z, int MODE, int pos, int degree, bool limb){glPushMatrix();if (pos == LEFT){if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0 && limb){glRotatef((GLfloat)larm, 1.0, 0.0, 0.0);}//else flag0 = false;}else if (pos == RIGHT){if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0 && limb){glRotatef((GLfloat)rarm, 1.0, 0.0, 0.0);}else flag0 = false;}glScaled(l, w, h);glTranslated(x, y, z);if (MODE == SOLID){glutSolidDodecahedron();}else if (MODE == WIRE){glutWireDodecahedron();}glPopMatrix();}//画旋转圆锥体void RdrawConed(double r, double l, double w, double h, double x, double y, double z, int MODE, int pos, int degree, bool limb){glPushMatrix();if (pos == LEFT){if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0 && limb){glRotatef((GLfloat)larm, 1.0, 0.0, 0.0);}//else flag0 = false;}else if (pos == RIGHT){if ((int)step % 2 == 0 && step>0) glRotatef((GLfloat)(-1 * (degree)), 1.0, 0.0, 0.0);else if ((int)step % 2 != 0 && step>1) glRotatef((GLfloat)degree, 1.0, 0.0, 0.0);else if (step == -1){glRotatef(0.0, 1.0, 0.0, 0.0);step = 0;flag0 = true;}if (!flag0 && limb){glRotatef((GLfloat)rarm, 1.0, 0.0, 0.0);}else flag0 = false;}glScaled(l, w, h);glTranslated(x, y, z);if (MODE == SOLID){glutSolidCone(r, h, 20, 20);}else if (MODE == WIRE){glutWireCone(r, h, 20, 20);}glPopMatrix();}void display(void){//清除缓冲区颜色glClear(GL_COLOR_BUFFER_BIT);//定义白色glColor3f(1.0, 1.0, 1.0);//圆点放坐标中心glLoadIdentity();//从哪个地方看gluLookAt(-2.0, -1.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glPushMatrix();//原地旋转if (flag == true)//先平移后旋转保证原地旋转{glTranslatef(0.0, 0.0, 0.0);dis = 0;glRotatef((float)spinX, 0.0, 1.0, 0.0);flag = false;}else//先旋转后平移保证行走路线正确{glRotatef((float)spinX, 0.0, 1.0, 0.0);glTranslatef(0.0, 0.0, (float)dis);}//头drawBall(2, 0, 1, 0, SOLID);//身体drawSkewed(5, 4.4, 4, 0, -0.75, 0, SOLID);//肩膀RdrawHalfBall(1, 3.5, -2.1, 0, SOLID, LEFT, 20);RdrawHalfBall(1, -3.5, -2.1, 0, SOLID, RIGHT, 20);//胳膊RdrawSkewed(1, 3, 1, 3.5, -1.3, 0, SOLID, LEFT, 20, true);RdrawSkewed(1, 3, 1, -3.5, -1.3, 0, SOLID, RIGHT, 20, true);//手RdrawBall(1, 3.5, -6.4, 0, SOLID, LEFT, 20);RdrawBall(1, -3.5, -6.4, 0, SOLID, RIGHT, 20);//腿RdrawSkewed(1.2, 3, 2, 1, -2.6, 0, SOLID, RIGHT, 10, false);RdrawSkewed(1.2, 3, 2, -1, -2.6, 0, SOLID, LEFT, 10, false);//脚RdrawSkewed(1.5, 1, 3, 0.9, -10, 0, SOLID, RIGHT, 10, false);RdrawSkewed(1.5, 1, 3, -0.9, -10, 0, SOLID, LEFT, 10, false);//武器选择if (weapon == 1) RdrawSkewed(1, 1, 11, 3.5, -6.4, 0.5, SOLID, LEFT, 20, true);else if (weapon == 2){RdrawSkewed(1, 1, 5, 3.5, -6.4, 0.5, SOLID, LEFT, 20, true);RdrawDodecahedrond(1, 1, 3, 3.5, -6.4, 2.5, SOLID, LEFT, 20, true);}else if (weapon == 3){RdrawSkewed(0.5, 0.5, 2.5, 7.0, -13.0, 0.5, SOLID, LEFT, 20, true);RdrawConed(0.5, 1, 1, 3.4, 3.5, -6.5, 0.8, SOLID, LEFT, 20, true);RdrawHalfBall0(1, 3.5, 2.1, 6.5, SOLID, LEFT, 20);}else if (weapon == 0){}glPopMatrix();glutSwapBuffers();}//鼠标点击事件void mouseClick(int btn, int state, int x, int y){moveX = x;GLfloat ambient[] = { (float)rand() / RAND_MAX, (float)rand() / RAND_MAX, (float)rand() / RAND_MAX, 0.1 };//设置环境光glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);//启用光源glEnable(GL_LIGHT0);}//键盘事件void keyPressed(unsigned char key, int x, int y){switch (key){case 'a'://逆时针绕中心轴旋转spinX -= 4;break;case 'd'://顺时针绕中心轴旋转spinX += 4;break;case 'w'://向前走if ((int)step % 2 != 0 && step>0) dis += 1;if ((int)step % 2 == 0 && step>0) dis += 1;step += 1;glutPostRedisplay();flag = false;break;case 's'://向后走if ((int)step % 2 != 0 && step>0) dis -= 1;if ((int)step % 2 == 0 && step>0) dis -= 1;step += 1;glutPostRedisplay();flag = false;break;case 'e'://立正step = -1;larm = 0;rarm = 0;glutPostRedisplay();case 'f'://左手挥下larm = (larm + 6) % 360;glutPostRedisplay();break;case 'r'://左手挥起larm = (larm - 6) % 360;glutPostRedisplay();break;case 'g'://右手挥下rarm = (rarm + 6) % 360;glutPostRedisplay();break;case 't'://右手挥起rarm = (rarm - 6) % 360;glutPostRedisplay();break;case '0':weapon = 0;glutPostRedisplay();break;case '1'://切换武器weapon = 1;glutPostRedisplay();break;case '2':weapon = 2;glutPostRedisplay();break;case '3':weapon = 3;glutPostRedisplay();break;default:break;}glutPostRedisplay();}// 鼠标移动事件 void mouseMove(int x, int y){int dx = x - moveX;printf("dx:%dx\n", dx);spinX += dx;flag = true;glutPostRedisplay();moveX = x;}void reshape(int w, int h){//定义视口大小glViewport(0, 0, (GLsizei)w, (GLsizei)h);//投影显示glMatrixMode(GL_PROJECTION);//坐标原点在屏幕中心glLoadIdentity();//操作模型视景gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);glMatrixMode(GL_MODELVIEW);}int main(int argc, char** argv){if (FSOUND_Init(44100, 32, 0))// 把声音初始化为44khz{// 载入文件bgmusic.mp3mp3back = FSOUND_Stream_OpenFile("music/Lady Gaga - Poker Face.mp3", FSOUND_LOOP_NORMAL, 0);}FSOUND_Stream_Play(FSOUND_FREE, mp3back);// 播放背景音乐 mp3//初始化glutInit(&argc, argv);//设置显示模式glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//初始化窗口大小glutInitWindowSize(500, 500);//定义左上角窗口位置glutInitWindowPosition(100, 100);//创建窗口glutCreateWindow("MYROBOT");//初始化init();//显示函数glutDisplayFunc(display);//窗口大小改变时的响应glutReshapeFunc(reshape);//鼠标点击事件,鼠标点击或者松开时调用glutMouseFunc(mouseClick);//鼠标移动事件,鼠标按下并移动时调用glutMotionFunc(mouseMove);//键盘事件glutKeyboardFunc(keyPressed);//循环glutMainLoop();return 0;}





0 0
原创粉丝点击