1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > openGL3D机器人鼠标变换视角 键盘移动

openGL3D机器人鼠标变换视角 键盘移动

时间:2022-02-01 04:05:20

相关推荐

openGL3D机器人鼠标变换视角 键盘移动

openGL3D机器人鼠标变换视角,键盘移动

简单实现3D机器人的移动和视角变换

简单机器人。设计机器人有四大部分组成,即头,身,双手和双腿,分别由立方体经过图形变换而成。

实现

移动时双手双腿摆动视角改变视角放缩

机器人组成实现

手腿代码中 glRotatef(-A, 1, 0, 0),参数A为手臂旋转角度

void draw_body(void) {glPushMatrix();glTranslatef(0, 2.2, 0);glScalef(0.5, 1, 0.4);glutSolidCube(4);glPopMatrix();}void draw_leftshoulder(void) {glPushMatrix();glTranslatef(1.5, 3.1, 0);//最后平移到glRotatef(-A, 1, 0, 0);//再摆动glTranslatef(0, -0.9, 0);//先平移到需摆动位置glScalef(0.4, 2, 0.5);glutSolidCube(2);glColor3f(1, 1, 1);glutWireCube(2);glPopMatrix();}void draw_rightshoulder(void) {glPushMatrix();glTranslatef(-1.5, 3.1, 0);glRotatef(A, 1, 0, 0);glTranslatef(0, -0.9, 0);glScalef(0.4, 2, 0.5);glutSolidCube(2);glColor3f(1, 1, 1);glutWireCube(2);glPopMatrix();}void draw_head(void){glPushMatrix();glTranslatef(0, 5.2, 0);glutWireSphere(1, 200, 500);glPopMatrix();}void draw_leftfoot(void) {glPushMatrix();glTranslatef(-0.6, -0.1, 0);glRotatef(-A, 1, 0, 0);glTranslatef(0, -1.8, 0);glScalef(0.4, 2, 0.5);glutSolidCube(2);glColor3f(1, 1, 1);glutWireCube(2);glPopMatrix();}void draw_rightfoot(void) {glPushMatrix();glTranslatef(0.6, -0.1, 0);glRotatef(A, 1, 0, 0);glTranslatef(0, -1.8, 0);glScalef(0.4, 2, 0.5);glutSolidCube(2);glColor3f(1, 1, 1);glutWireCube(2);glPopMatrix();}void draw_floor(){glColor3f(0.6, 0.3, 0.1);glPushMatrix();glScalef(100, 0.00001, 100);glutSolidCube(1);glColor3f(0,1,0);glutWireCube(1);glPopMatrix();}

机器人键盘响应

q,e操作图形缩放,通过控制裁剪窗口的大小实现

a,d操作机器人转向,控制自转角度angle实现

w,s操作机器人前进后退,用数组储存每次移动时的角度,display()循环数组平移实现同时移动时改变A的大小实现手臂摆动

void myKeyBoard(unsigned char key,int x,int y) {switch (key){case 'q':distance = distance * 1.1;break;case 'e':distance = distance * 0.9;break;case 'a':angle += 5;break;case 'd':angle -= 5;break;case 'w':if (A >= 40 || A <= -40)flag = !flag;if (flag)A += 5;elseA -= 5;advance[k]=angle;f[k] = 1;k++;break;case 's':if (A >= 40 || A <= -40)flag = !flag;if (flag)A -= 5;elseA += 5;advance[k] =angle;f[k] = -1;k++;break;default:break;}glutPostRedisplay();}

机器人鼠标改变视角

左键拖动改变视角,右键恢复到初始视角

void view() {ry = cos(u);rx = sin(u) * cos(v);rz = sin(u) * sin(v);gluLookAt(rx, ry,rz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);// 设置视点}//左键拉视角,右键回归原始视角void mymouse(int button, int state, int x, int y){if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){lastX = x;lastY = y;}if (button == GLUT_LEFT_BUTTON && state == GLUT_UP){glutPostRedisplay();}if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP){u = PI / 2;v = PI / 2;glutPostRedisplay();}}//鼠标控制视角void mymotion(int x, int y){xoffset = lastX-x ;yoffset = y-lastY;lastX = x;lastY = y;if (xoffset > 0)v -= 0.01;if (xoffset < 0)v += 0.01;if (yoffset > 0)u -= 0.01;if (yoffset < 0)u += 0.01;glutPostRedisplay();}

机器人实现代码

#include <GL/glut.h>#include<iostream>#include<math.h>#define PI 3.141592void view();void myKeyBoard(unsigned char key, int x, int y);void mymouse(int button, int state, int x, int y);void reshape(int w, int h);void init();void display();void mymotion(int x, int y);void draw_body(void);void draw_leftshoulder(void);void draw_rightshoulder(void);void draw_head(void);void draw_leftfoot(void);void draw_rightfoot(void);void draw_floor();bool flag = true;int f[60000];int k = 0;GLfloat u = PI / 2, v = PI / 2;GLfloat advance[60000] = {0}, angle = 0;GLfloat A = 0;GLfloat distance = 1;GLfloat radius = 3.0; // 摄像机的旋转半径GLfloat rx = 0, ry = 0, rz = radius;GLfloat lastX = 0; // 鼠标上一帧的位置GLfloat lastY = 0;GLfloat xoffset; // 鼠标x坐标的偏移量GLfloat yoffset;int main(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPTSTR lpCmdLine, intnCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);char* argv[] = {(char*)"hello ",(char*)" " };int argc = 2; // must / should match the number of strings in argvglutInit(&argc, argv);//初始化 GLUT库//设置深度检测下的显示模式(缓存,颜色类型,深度值)glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(600, 500);glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250);glutCreateWindow("简单机器人");// 创建窗口glutKeyboardFunc(myKeyBoard);glutReshapeFunc(reshape);glutMouseFunc(mymouse);glutMotionFunc(mymotion);init();glutDisplayFunc(display);//用于绘制当前窗口glutMainLoop();//表示开始运行程序,用于程序的结尾return 0;}void reshape(int w, int h){glViewport(0, 0, w, h);}void init(){glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);glEnable(GL_POINT_SMOOTH);glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);glEnable(GL_POLYGON_SMOOTH);glLineWidth(3);glEnable(GL_DEPTH_TEST);//启用深度检测}void display(){GLfloat w = glutGet(GLUT_SCREEN_WIDTH);//获取屏幕宽度GLfloat h = glutGet(GLUT_SCREEN_HEIGHT);//获取屏幕高度GLfloat ratio = w / h;glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)//保持形状不变glOrtho(-40 * distance, 40 * distance, -40 * distance*w/h, 40 * distance*w/h, -2000, 2000);//定义三维观察体elseglOrtho(-40 * distance * ratio, 40 * distance * ratio, -40 * distance, 40 * distance, -2000, 2000);//定义三维观察体// gluPerspective(60, w / h, 1, 200);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 启用深度检测下的清屏模式glMatrixMode(GL_MODELVIEW);// 矩阵模式设置glLoadIdentity();//清空矩阵堆栈view();// 设置视点//地面draw_floor();glPushMatrix();for (int i = 0;i <= k;i++){glTranslatef(f[i] * 0.1*sin(advance[i] / 180*PI), 0, f[i] * 0.1*cos(advance[i] / 180*PI));//glTranslatef(f[i] * sin(advance[i] / 360), 0, f[i] * cos(advance[i] / 360));}//机器人glRotatef(angle, 0, 1, 0);glTranslatef(0, 4, 0);glColor3f(1, 0, 0);draw_body();glColor3f(1, 0, 1);draw_head();glColor3f(1, 1, 0);draw_leftshoulder();glColor3f(1, 1, 0);draw_rightshoulder();glColor3f(0, 1, 1);draw_leftfoot();glColor3f(0, 1, 1);draw_rightfoot();glPopMatrix();glutSwapBuffers(); //双缓冲下的刷新方法}//视角转换void view() {ry = cos(u);rx = sin(u) * cos(v);rz = sin(u) * sin(v);gluLookAt(rx, ry,rz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);// 设置视点}//左键拉视角,右键回归原始视角void mymouse(int button, int state, int x, int y){if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){lastX = x;lastY = y;}if (button == GLUT_LEFT_BUTTON && state == GLUT_UP){glutPostRedisplay();}if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP){u = PI / 2;v = PI / 2;glutPostRedisplay();}}//鼠标控制视角void mymotion(int x, int y){xoffset = lastX-x ;yoffset = y-lastY;lastX = x;lastY = y;if (xoffset > 0)v -= 0.01;if (xoffset < 0)v += 0.01;if (yoffset > 0)u -= 0.01;if (yoffset < 0)u += 0.01;glutPostRedisplay();}//q,e放缩视角;w,s前进后退;a,d控制方向void myKeyBoard(unsigned char key,int x,int y) {switch (key){case 'q':distance = distance * 1.1;break;case 'e':distance = distance * 0.9;break;case 'a':angle += 5;break;case 'd':angle -= 5;break;case 'w':if (A >= 40 || A <= -40)flag = !flag;if (flag)A += 5;elseA -= 5;advance[k]=angle;f[k] = 1;k++;break;case 's':if (A >= 40 || A <= -40)flag = !flag;if (flag)A -= 5;elseA += 5;advance[k] =angle;f[k] = -1;k++;break;default:break;}glutPostRedisplay();}void draw_body(void) {glPushMatrix();glTranslatef(0, 2.2, 0);glScalef(0.5, 1, 0.4);glutSolidCube(4);glPopMatrix();}void draw_leftshoulder(void) {glPushMatrix();glTranslatef(1.5, 3.1, 0);glRotatef(-A, 1, 0, 0);glTranslatef(0, -0.9, 0);glScalef(0.4, 2, 0.5);glutSolidCube(2);glColor3f(1, 1, 1);glutWireCube(2);glPopMatrix();}void draw_rightshoulder(void) {glPushMatrix();glTranslatef(-1.5, 3.1, 0);glRotatef(A, 1, 0, 0);glTranslatef(0, -0.9, 0);glScalef(0.4, 2, 0.5);glutSolidCube(2);glColor3f(1, 1, 1);glutWireCube(2);glPopMatrix();}void draw_head(void){glPushMatrix();glTranslatef(0, 5.2, 0);glutWireSphere(1, 200, 500);glPopMatrix();}void draw_leftfoot(void) {glPushMatrix();glTranslatef(-0.6, -0.1, 0);glRotatef(-A, 1, 0, 0);glTranslatef(0, -1.8, 0);glScalef(0.4, 2, 0.5);glutSolidCube(2);glColor3f(1, 1, 1);glutWireCube(2);glPopMatrix();}void draw_rightfoot(void) {glPushMatrix();glTranslatef(0.6, -0.1, 0);glRotatef(A, 1, 0, 0);glTranslatef(0, -1.8, 0);glScalef(0.4, 2, 0.5);glutSolidCube(2);glColor3f(1, 1, 1);glutWireCube(2);glPopMatrix();}void draw_floor(){glColor3f(0.6, 0.3, 0.1);glPushMatrix();glScalef(100, 0.00001, 100);glutSolidCube(1);glColor3f(0,1,0);glutWireCube(1);glPopMatrix();}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。