设为首页 加入收藏

TOP

使用OpenGL实现一个简易的Robot模拟(一)
2014-11-24 14:00:02 来源: 作者: 【 】 浏览:3
Tags:使用 OpenGL 实现 一个 简易 Robot 模拟

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


效果图如下:


代码如下:


#include
#include
#include
#include
#include
/*
作者: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);



glPushMatrix();
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glLightfv(GL_LIGHT0

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android工程gen目录无法生成的解.. 下一篇如何使用Git 发Patch

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: