1. 程式人生 > >使用opengl實現一個簡易的robot模擬

使用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;    
//光照  使用光源
GLfloatlightPos[] = { 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,GL_SPOT_DIRECTION,spotDir);
  //畫一個光源
  glColor3ub(255,0,0); 
  glTranslatef(lightPos[0],lightPos[1],lightPos[2]);


       glutSolidCone(0.3f,0.3f,10,10);
  glPushAttrib(GL_LIGHTING_BIT);
  glDisable(GL_LIGHTING);
  glColor3ub(255,255,0);
  glutSolidSphere(0.1f,10.0f,10);
  glPopAttrib();
       glPopMatrix();


       glTranslatef (0.0, -0.5, 0.0);   
       glColor3f(0.8,1.0,0.2);   
       glPushMatrix();
       glScalef (0.5, 1.0, 0.5);
       glutSolidCube(1.0);  
       glPopMatrix();   
   
       glTranslatef (0.0, -0.5, 0.0);//提起右小腿   
       glRotatef ((GLfloat) elbow, 1.0, 0.0, 0.0);  
       glTranslatef (0.0, -0.5, 0.0);  
      
       glColor3f(0.5,0.1,0.8);        
       glPushMatrix();  
           glScalef (0.5, 1.0, 0.5);  
           glutSolidCube(1.0);  
       glPopMatrix();   
   
       glTranslatef (0.0, -0.5, -0.1);//右腳   
       glColor3f(0.5,0.2,1.0);     
       glPushMatrix();  
           glScalef (0.5, 0.1, 0.7);  
           glutSolidCube(1.0);  
       glPopMatrix();   
    glPopMatrix ();   
   
    glPushMatrix();  
       glTranslatef (forward,0.0,z);   
       glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0);   
   
       glTranslatef (-0.375, 0.0, 0.0);//左大腿   
       glRotatef ((GLfloat) shoulder1, 1.0, 0.0, 0.0);  
       glTranslatef (0.0, -0.5, 0.0);   
   
       glColor3f(0.8,1.0,0.2);   
       glPushMatrix();  
           glScalef (0.5, 1.0, 0.5);  
           glutSolidCube(1.0);  
       glPopMatrix();   
   
   
       glTranslatef (0.0, -0.5, 0.0);//左小腿   
       glRotatef ((GLfloat) elbow, 1.0, 0.0, 0.0);  
       glTranslatef (0.0, -0.5, 0.0);  
      
       glColor3f(0.5,0.1,0.8);   
       glPushMatrix();  
           glScalef (0.5, 1.0, 0.5);//縮放四方體
           glutSolidCube(1.0);//畫四方體  
       glPopMatrix();   
       glTranslatef (0.0, -0.5, -0.1);//左腳   
       glColor3f(0.5,0.2,1.0);   
       glPushMatrix();  
           glScalef (0.5, 0.1, 0.7);  
           glutSolidCube(1.0);  
       glPopMatrix();   
   
   glPopMatrix();   
          
   glPushMatrix();   
       glTranslatef (forward,0.0,z);   
       glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0);  
         
       glTranslatef (0.0, 1.0,  0.0);//軀幹   
          
       glColor3f(0.5,0.5,1.0);   
       glPushMatrix();  
           glScalef (1.4, 2.0, 0.5);  
           glutSolidCube(1.0);  
       glPopMatrix();   
   
          
       glTranslatef (0.0, 1.25, 0.0);//頭   
       glColor3f(1.0,0.3,0.2);   
       glPushMatrix();  
           glScalef (0.5, 0.5, 0.5);  
           glutSolidCube(1.0);  
       glPopMatrix();   
   
   glPopMatrix();   
          
   glPushMatrix();   
       glTranslatef (forward,0.0,z);   
       glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0);  
          
    
       glTranslatef (0.85, 1.75, 0.0);//右臂   
       glRotatef ((GLfloat) shoulder1, 1.0, 0.0, 0.0);  
       glTranslatef (0.0, -0.5, 0.0);  
      
       glColor3f(1.0,0.0,1.0);      
       glPushMatrix();  
           glScalef (0.3, 1.3, 0.4);  
           glutSolidCube(1.0);  
       glPopMatrix();   
   
   glPopMatrix();   
   glPushMatrix();   
       glTranslatef (forward,0.0,z);   
       glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0);  
          
       glTranslatef (-0.85, 1.75, 0.0);//左臂   
       glRotatef ((GLfloat) shoulder2, 1.0, 0.0, 0.0);  
       glTranslatef (0.0, -0.5, 0.0);  
      
       glColor3f(1.0,0.0,1.0);   
       glPushMatrix();  
           glScalef (0.3, 1.3, 0.4);  
           glutSolidCube(1.0);  
       glPopMatrix();   


   glPopMatrix();   


   glutSwapBuffers();  
}     
//隨便畫一些小東西
void  Something()
{
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glTranslatef(0,-3.5f,0);
glutWireSphere(2.0f,50,50);
glutWireTorus(0.3f, 1.0f,50,50);
glutWireCone(0.30f, 1.1f, 20, 20);
glPopMatrix();
}
void renderBitmapString(float x, float y, void *font,char *string)   
{   
  char *c;   
  glRasterPos2f(x, y);   
  for (c=string; *c != '\0'; c++) {   
    glutBitmapCharacter(font, *c);   
  }   
}   
  
void reshape (int w1, int h1)  
{   
    w=w1;   
    h=h1;  
   glViewport (0, 0, (GLsizei) w1, (GLsizei) h1);   
   glMatrixMode (GL_PROJECTION);  
   glLoadIdentity ();  
   gluPerspective(65.0, (GLfloat) w1/(GLfloat) h1, 1.0, 20.0);  
   glMatrixMode(GL_MODELVIEW);  
   glLoadIdentity();  
   glTranslatef (0.0, 0.0, -8.0);  
}  
  
void keyboard (unsigned char key, int x, int y)  
{  
   switch (key) {  
      case 'w': //向後走 
         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;  
         }  
IsStop=true;
         glutPostRedisplay();  
         break;  
      case 's': //向前走 
         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;  
         }  
IsStop=true;
         glutPostRedisplay();  
         break;  
      case 'd'://右轉
         turn = (turn - 5) % 360;  
         glutPostRedisplay(); 
IsStop=true;
         break;  
      case 'a'://左轉
         turn = (turn + 5) % 360;  
         glutPostRedisplay();
IsStop=true;
         break;  
      case 'l':  
         shoulder1 = (shoulder1 + 2) % 360;  
         shoulder2 = (shoulder2 - 4) % 360;  
         glutPostRedisplay();  
IsStop=true;
         break;  
      case 'L':  
         shoulder1 = (shoulder1 - 5) % 360;  
         shoulder2 = (shoulder2 + 10) % 360;  
         glutPostRedisplay(); 
IsStop=true;
         break;  
 case 'P':
 IsStop=false;
 break;
 case 'p':
 IsStop=false;
 break;
      case 27:  
         exit(0);  
         break;  
      default:  
         break;  
   }  
}   
//設定視覺角度  
void setOrthographicProjection()    
{   
    glMatrixMode(GL_PROJECTION);   
    glPushMatrix();   
    glLoadIdentity();   
    gluOrtho2D(0, w, 0, h);   
    glScalef(1, -1, 1);   
    glTranslatef(0, -h, 0);   
    glMatrixMode(GL_MODELVIEW);   
}   
void resetPerspectiveProjection()    
{   
    glMatrixMode(GL_PROJECTION);   
    glPopMatrix();   
    glMatrixMode(GL_MODELVIEW);   
}
//光源的座標變化
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP)
xRot-= 5.0f;
if(key == GLUT_KEY_DOWN)
xRot += 5.0f;
if(key == GLUT_KEY_LEFT)
yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT)
yRot += 5.0f;
if(key > 356.0f)
xRot = 0.0f;
if(key < -1.0f)
xRot = 355.0f;
if(key > 356.0f)
yRot = 0.0f;
if(key < -1.0f)
yRot = 355.0f;
glutPostRedisplay();

//滑鼠事件
void Mouse(int button,int state, int x, int y)      
{
    if (state == GLUT_DOWN)//滑鼠按下
{
if (x<0)
{
//向左旋轉
yRot -= 5.0f;
}else if (x>=0)
{
//向右旋轉
yRot += 5.0f;
}else if (y>=0)
{
//向上旋轉
xRot-= 5.0f;
}else if (y<0)
{
//向下旋轉
xRot += 5.0f;
}
if(xRot> 356.0f)
xRot = 0.0f;
if(xRot < -1.0f)
xRot = 355.0f;
if(yRot > 356.0f)
yRot = 0.0f;
if(yRot < -1.0f)
yRot = 355.0f;
glutPostRedisplay();
}
}
//時間函式,定時重新整理
void TimerFunction(int value)
{
display();
    glutPostRedisplay();
glutTimerFunc(33,TimerFunction, 1);
}
//主函式
int main(int argc, char** argv)  
{  
   glutInit(&argc, argv);  
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);  
   glutInitWindowSize (800, 600);   
   glutInitWindowPosition (100, 100);  
   glutCreateWindow("機器人 按W向前走  按s向後走   按a向左轉  按d向右轉   按p可以自行轉動");
   SetupRC(); 
   glutDisplayFunc(display);   
   glutReshapeFunc(reshape);  
   glutKeyboardFunc(keyboard);
   glutSpecialFunc(SpecialKeys);
   glutMouseFunc(Mouse);
   glutTimerFunc(33, TimerFunction, 1);
  // glutIdleFunc(display); 
   
   glutMainLoop();  
   return 0;  
}  

相關推薦

使用opengl實現一個簡易robot模擬

#include <gl/glut.h>    #include <stdio.h>     #include <string.h>     #include <stdlib.h>    #include <math.h>  /* 作者:chenji

基於OpenGL編寫一個簡易的2D渲染框架-04 繪制圖片

著色器 drawtext 結構 渲染 images ron renderer make 制圖 閱讀文章前需要了解的知識,紋理:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/  

基於OpenGL編寫一個簡易的2D渲染框架-05 渲染文本

new 坐標 false 證明 ont 獲取 simple 了解 param 閱讀文章前需要了解的知識:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 簡要步

基於OpenGL編寫一個簡易的2D渲染框架-13 使用例子

tom 進行 prim demo custom 第一個 manager sets mar 這是重構渲染器的最後一部分了,將會給出一個 demo,測試模板測試、裁剪測試、半透明排序等等: 上圖是本次 demo 的效果圖,中間的綠色圖形展現的是模板測試。 模板測試

用java實現一個簡易編譯器1-詞法解析入門

new 概念 自加 我們 sta 數字 獲得 () 操作系統 本文對應代碼下載地址為: http://download.csdn.net/detail/tyler_download/9435103 視頻地址: http://v.youku.com/v_show/id_XMT

使用 RxJS 實現一個簡易的仿 Elm 架構應用

inter bject compute 幫助 規律 returns date rgs 個人愛好 使用 RxJS 實現一個簡易的仿 Elm 架構應用

在Android中實現一個簡易的Http服務器

.get json data ESS public 瀏覽器 顯示 getmethod blank 最近遇到一個需求需要在App中創建一個Http服務器供供瀏覽器調用,用了下開源的微型Htpp服務器框架:NanoHttpd,項目地址:https://github.com/Na

實現一個簡易的express中間件

str 修改 clas middle 分享圖片 next 測試 inf 返回 代碼: // 通過閉包實現單例 const Middlewave = (function(){ let instance; class Middlewave{ c

手動實現一個簡易版SpringMvc

版權宣告:本篇部落格大部分程式碼引用於公眾號:java團長,我只是在作者基礎上稍微修改一些內容,內容僅供學習與參考 前言:目前mvc框架經過大浪淘沙,由最初的struts1到struts2,到目前的主流框架SpringMvc,並逐漸區域佔領市場主流穩定狀態,由於其背後強大的Spring家族提供了一系列高可用

SSM+WebSocket實現一個簡易網頁版通訊工具

編譯環境:jdk1.8 , tomcat8.0+ , IDEA 這裡主要講一下websocket的資訊傳遞,以如何實現多人實時線上聊天為例: websocket主要的三個類 MyWebSocketConfig主要負責配置websocket的處理器和握手攔截器 MyHandSha

vue實現一個簡易Popover組件

方法 height 自定義 它的 direct val code button update 概述 之前寫vue的時候,對於下拉框,我是通過在組件內設置標記來控制是否彈出的,但是這樣有一個問題,就是點擊組件外部的時候,怎麽也控制不了下拉框的關閉,用戶體驗非常差。 當時想到的

使用WX包實現一個簡易的古詩文欣賞軟體

寫在前面 用python的WX包來實現一個簡易的古詩文閱覽軟體,幫助自己欣賞古詩文,軟體如下: 所有顯示的古詩文均來自爬蟲欄中的《python爬取古詩文網站詩文一欄的所有詩詞》爬到的資訊,現在將他們隨機展示出來。 開始正文 1.展示匯入的包 在此,主要用到3個包,分別為

DirectX11 With Windows SDK--13 動手實現一個簡易Effects框架、陰影效果繪製

前言 到現在為止,所有的教程專案都沒有使用Effects11框架類來管理資源。因為在D3DCompile API (#47)版本中,如果你嘗試編譯fx_5_0的效果檔案,會收到這樣的警告: X4717: Effects deprecated for D3DCompiler_47 在未來的版本中,D3DComp

Netty+Websocket 實現一個簡易聊天室

後臺程式碼 /** * 服務端 */ public class ChatServer { public static void main(String[] args) throws Exception { int port=8080; //服務端預設埠 new Ch

實現一個簡易的vue的mvvm(defineProperty)

這是一個最近一年很火的面試題,很多人看到這個題目從下手,其實查閱一些資料後,簡單的模擬還是不太難的: vue不相容IE8以下是因為他的實現原理使用了 Object.defineProperty 的get和set方法,首先簡單介紹以下這個方法 我們看到控制檯

Android 實現一個簡易橫向流式佈局

SimpleFlowLayout:一個簡易的橫向流式佈局,只實現核心功能,使用者可自行擴充套件   Demo圖片如下所示: SimpleFlowLayout直接繼承自ViewGroup,主要負責

利用HashMap,自己實現一個簡易版的HashSet

簡介 HashSet是常用的容器類,主要特徵表現為不可重複性 其內部實現主要用到了HashMap,利用了HashMap的鍵的不可重複性 使用HashMap的鍵作為其元素,同時令HashMap的所有的

(2) 用java實現一個簡易編譯器1-詞法解析入門

轉載地址 : http://blog.csdn.net/tyler_download/article/details/50668983/ 視訊地址 : http://study.163.com/course/courseLearn.htm?courseId=10028300

實現一個簡易的vue

1./compiler ⽬目錄是編譯模版; 2./core ⽬目錄是 Vue.js 的核⼼心(也是後⾯面的重點); 3./platforms ⽬目錄是針對核⼼心模組的 ‘平臺’ 模組; 4./server ⽬目錄是處理理服務端渲染; 5./sfc ⽬目錄處理理單⽂檔案 .vue;

[譯]C語言實現一個簡易的Hash table(1)

說明 Hash table翻譯過來就是Hash表,是一種提供了類似於關聯陣列的資料結構,可以通過key執行搜尋、插入和刪除操作。Hash表由一些列桶(buckets)組成,而每一個bucket都是由key-value的形式組成。儲存時都是以key-value儲存的,因為當要定位一個value時,需要把k