使用OpenGL实现一个简易的Robot模拟

这是我一个很早以前写得关于3D Robot仿真模拟的一个简易实现方式。希望对于学习OpenGL的同学有帮助。

效果图如下:

使用OpenGL实现一个简易的Robot模拟

代码如下:

#include <gl/glut.h>  
#include <stdio.h>   
#include <string.h>   
#include <stdlib.h>  
#include <math.h>
/*
作者:chenjieb520
*1、显示场景,并在指定视线方向观察显示场景,并在指定视线方向观察显示场景,并在指定视线方向观察
    能够借助键盘或鼠,能够借助键盘或鼠,能够借助键盘或鼠
    标交互动态观察场景。标交互动态观察场景。标交互动态观察场景。
 
*2、渲染的实现,至少实现两种局部光渲染的实现和一种全局光照模型
*/ 
/*
 *机器人运动时 动作转化
 */
static int shoulder1 = 0;
static int shoulder2 = 0;
static int hand=0;
static int turn1=0;
static int tag=0;


static int turn=0 ;//转弯
static float forward=0;//前进
static float elbow = 0 ,z=0; 
int w;  
int h;  
int font=(int)GLUT_BITMAP_8_BY_13;  
char s[30];  
int frame,timeOwn,timebase=0;


static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
//是否停止转动
bool  IsStop=false;   
//光照  使用光源
GLfloat lightPos[] = { 1.0f, 0.0f, -1.0f, 0.0f };
GLfloat  specular[] = { 1.0f, 1.0f, 1.0f, -1.0f};//反射光
GLfloat  specref[] =  { 1.0f, 1.0f, 1.0f, 1.0f };//a
GLfloat  ambientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f};//环绕光
GLfloat  spotDir[] = { 0.0f, 0.0f, -1.0f };
GLboolean bEdgeFlag = TRUE;


void showText(void);  
void resetPerspectiveProjection() ;   
void setOrthographicProjection() ;  
void Something();
void renderBitmapString(float x, float y, void *font,char *string);   
//设置背景
void SetupRC(void) 
{
glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,ambientLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);


glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,30.0f);
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,20.0f);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);


glMaterialfv(GL_FRONT, GL_SPECULAR,specref);
glMateriali(GL_FRONT, GL_SHININESS,8);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );

 
void display(void) 

   glClear (GL_COLOR_BUFFER_BIT);
   glShadeModel(GL_SMOOTH);
   if (IsStop==false)
   {
  turn = (turn - 5) % 360;
  if (forward<2)
  {
  turn1=turn; 
  forward = forward -0.04*sin((GLfloat)turn1/360*3.14*2); 
  z=z-0.05*cos((GLfloat)turn1/360*3.14*2); 
 
  if(tag==0){ 
  shoulder1 = (shoulder1 + 1); 
  shoulder2 = (shoulder2 - 1); 
  if(shoulder1>=0){elbow=elbow-1.2;} 
  else{elbow=elbow+1.2;} 
  } 
  else 
  { 
  shoulder1 = (shoulder1 - 1); 
  shoulder2 = (shoulder2 + 1); 
  if(shoulder1>=0){elbow=elbow+1.25;} 
  else{elbow=elbow-1.2;} 
  } 
  if(shoulder1>30){ 
  tag=1; 
  } 
  if(shoulder1<-30){ 
  tag=0;
  } 
  }else
  {
  turn1=turn; 
  forward = forward +0.04*sin((GLfloat)turn1/360*3.14*2); 
  z=z+0.05*cos((GLfloat)turn1/360*3.14*2);
  if(tag==0){ 
  shoulder1 = (shoulder1 - 1); 
  shoulder2 = (shoulder2 + 1); 
  } 
  else 
  { 
  shoulder1 = (shoulder1 + 1); 
  shoulder2 = (shoulder2 - 1); 
  } 
  if(shoulder1>30)
  { 
  tag=0; 
  } 
  if(shoulder1<-30)
  { 
  tag=1;
  } 
  }
   }
   //
   glBegin(GL_QUADS);
   glColor3ub(0,32,0);
   glVertex3f(8.0f, -3.0f, -4.0f);
   glVertex3f(-8.0f, -3.0f, -4.0f);
   glColor3ub(0,255,0);
   glVertex3f(-8.0f, -3.0f, 4.0f);
   glVertex3f(8.0f, -3.0f, 4.0f);
   glEnd();


   //机器人运动
   glPushMatrix(); 
       glTranslatef (forward,0.0,z); //前进 
       glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0);
  Something();


       glTranslatef (0.375,0.0, 0.0);//提起右大腿
       glRotatef ((GLfloat) shoulder2, 1.0, 0.0, 0.0);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wywdxj.html