欧美日韩不卡一区二区三区,www.蜜臀.com,高清国产一区二区三区四区五区,欧美日韩三级视频,欧美性综合,精品国产91久久久久久,99a精品视频在线观看

C語言

c語言實現(xiàn)多線程動畫程序

時間:2025-05-22 13:29:29 C語言 我要投稿
  • 相關(guān)推薦

c語言實現(xiàn)多線程動畫程序范例

  如何用c語言實現(xiàn)多線程動畫程序呢?想要了解的朋友,以下是為大家分享的c語言實現(xiàn)多線程動畫程序的范例,供大家參考借鑒,歡迎瀏覽!

  該程序是利用opengl圖形庫與fmod音頻庫寫的一個簡單3d動畫程序。該程序在vs下運行良好,若缺少相關(guān)dll文件請確認已配制fmod與opengl庫。

  mixmodel.cpp

  復制代碼 代碼如下:

  // mixmodel.cpp : 定義控制臺應用程序的入口點。

  //

  #include "stdafx.h"

  //定義一個線程

  DWORD WINAPI SoundProc(

  LPVOID LPVIDEOPARAMETERS);

  //光照變量

  GLfloat whiteLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };

  GLfloat sourceLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };

  GLfloat lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };

  //貼圖變量

  GLuint toTextures[4];

  char* szFiles[4] = {"bcb.bmp","sun.bmp","earth.bmp","moon.bmp"};

  //聲音引擎查錯函數(shù)

  void ERRCHECK(FMOD_RESULT result)

  {

  if(result != FMOD_OK)

  {

  printf("FMOD error!(%d) %sn",result,FMOD_ErrorString(result));

  //exit(-1);

  }

  }

  void Initial()

  {

  AUX_RGBImageRec* Image[4];

  int i;

  glEnable(GL_DEPTH_TEST);// 啟用深度測試

  glFrontFace(GL_CCW);// 指定逆時針繞法表示多邊形正面

  glEnable(GL_CULL_FACE);// Do not calculate inside of jet

  // Enable lighting

  glEnable(GL_LIGHTING);

  // Setup and enable light 0

  glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);

  glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);

  glLightfv(GL_LIGHT0,GL_POSITION,lightPos);

  glEnable(GL_LIGHT0);

  // Enable color tracking

  glEnable(GL_COLOR_MATERIAL);

  // Set Material properties to follow glColor values

  glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

  glClearColor(0.0f, 0.0f, 0.0f, 1.0f );//背景為黑色

  glGenTextures(4, toTextures);

  for(i=0;i<4;i++)

  {

  // Load environment map

  glBindTexture(GL_TEXTURE_2D, toTextures[i]);

  Image[i] = auxDIBImageLoadA(szFiles[i]);

  glTexImage2D(GL_TEXTURE_2D, 0, 3, Image[i]->sizeX, Image[i]->sizeY, 0, GL_RGB , GL_UNSIGNED_BYTE, Image[i]->data);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

  }

  glEnable(GL_TEXTURE_2D);

  glEnable(GL_TEXTURE_GEN_S);

  glEnable(GL_TEXTURE_GEN_T);

  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);

  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);

  }

  void drawsphere()

  {

  static float fElect1 = 0.0f;

  glTranslatef(0.0f, 0.0f, -250.0f);

  glBindTexture(GL_TEXTURE_2D,toTextures[1]);

  glDisable(GL_LIGHTING);

  // 繪制紅色的太陽模型

  //glShadeModel(GL_SMOOTH);

  glColor3f(1.0f, 0.0f, 0.0f);

  glutSolidSphere(12.0f, 100, 100);

  glEnable(GL_LIGHTING);

  // 當前繪制顏色變?yōu)樗{色

  //glShadeModel(GL_FLAT);

  glBindTexture(GL_TEXTURE_2D,toTextures[2]);

  glColor3f(0.0f, 0.0f, 1.0f);

  //繪制地球

  //保存當前的模型視圖矩陣

  //glPushMatrix();

  glLightfv(GL_LIGHT0,GL_POSITION,lightPos);

  glRotatef(fElect1, 0.0f, 1.0f, 0.0f);//繞y軸旋轉(zhuǎn)一定的角度

  glTranslatef(90.0f, 0.0f, 0.0f);//平移一段距離

  glutSolidSphere(9.0f, 100, 100);

  glBindTexture(GL_TEXTURE_2D,toTextures[3]);

  glColor3f(1.0f,1.0f,0.0f);

  glRotatef(fElect1*4, 0.0f, 1.0f, 0.0f);

  glTranslatef(40.0f, 0.0f, 0.0f);

  glutSolidSphere(5.0f, 100, 100);

  // 恢復矩陣

  glPopMatrix();

  // 增加旋轉(zhuǎn)步長

  fElect1 += 5.0f;

  if(fElect1 > 360.0f)fElect1 = 5.0f;

  }

  void ChangeSize(int w, int h)

  {

  if(h == 0)h = 1;

  // 設置視區(qū)尺寸

  glViewport(0, 0, w, h);

  glMatrixMode(GL_PROJECTION);

  glLoadIdentity();

  // 設置修剪空間

  GLfloat fAspect;

  fAspect = (float)w/(float)h;

  gluPerspective(45.0, fAspect, 1.0, 500.0);

  /*

  if (w <= h)

  glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f);

  else

  glOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f);

  */

  glMatrixMode(GL_MODELVIEW);

  glLoadIdentity();

  }

  void RenderScene(void)

  {

  // 旋轉(zhuǎn)的角度

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  // 重置模型視圖矩陣

  //glMatrixMode(GL_MODELVIEW);

  glMatrixMode(GL_PROJECTION);

  glPushMatrix();

  glLoadIdentity();

  gluOrtho2D(0.0f, 1.0f, 0.0f, 1.0f);

  glMatrixMode(GL_MODELVIEW);

  glBindTexture(GL_TEXTURE_2D, toTextures[0]);

  glDisable(GL_TEXTURE_GEN_S);

  glDisable(GL_TEXTURE_GEN_T);

  glDepthMask(GL_FALSE);

  glBegin(GL_QUADS);

  glTexCoord2f(0.0f, 0.0f);

  glVertex2f(0.0f, 0.0f);

  glTexCoord2f(1.0f, 0.0f);

  glVertex2f(1.0f, 0.0f);

  glTexCoord2f(1.0f, 1.0f);

  glVertex2f(1.0f, 1.0f);

  glTexCoord2f(0.0f, 1.0f);

  glVertex2f(0.0f, 1.0f);

  glEnd();

  glMatrixMode(GL_PROJECTION);

  glPopMatrix();

  //glLoadIdentity();

  //

  glMatrixMode(GL_MODELVIEW);

  glEnable(GL_TEXTURE_GEN_S);

  glEnable(GL_TEXTURE_GEN_T);

  glDepthMask(GL_TRUE);

  //glLoadIdentity();

  glPushMatrix();

  //將圖形沿z軸負向移動

  drawsphere();

  glutSwapBuffers();

  }

  void TimerFunc(int value)

  {

  glutPostRedisplay();

  glutTimerFunc(100, TimerFunc, 1);

  }

  //背景音樂的調(diào)度函數(shù)

  void bcsound()

  {

  FMOD_RESULT result;

  FMOD::System *system;

  FMOD::Channel *channel;

  result = FMOD::System_Create(&system); // 創(chuàng)造FMOD的系統(tǒng)內(nèi)核對象

  ERRCHECK(result);

  result = system->setSpeakerMode(FMOD_SPEAKERMODE_5POINT1); // 設置5.1聲道模式

  ERRCHECK(result);

  result = system->setSoftwareChannels(100); // 調(diào)整軟件混合

  ERRCHECK(result);

  result = system->setHardwareChannels(32); // 調(diào)整硬件混合

  ERRCHECK(result);

  result = system->init(200, FMOD_INIT_NORMAL, 0); // 初始化FMOD,音量大小為200

  ERRCHECK(result);

  FMOD::Sound *sound;

  result = system->createSound("P115.ogg", FMOD_DEFAULT, 0, &sound); //載入磁盤文件到內(nèi)存,(全部載入后返回)

  ERRCHECK(result);

  unsigned int lenms;

  result = sound->getLength(&lenms,FMOD_TIMEUNIT_MS);

  ERRCHECK(result);

  result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);//播放

  ERRCHECK(result);

  Sleep(lenms);

  result = system->createSound("End Theme.mp3", FMOD_DEFAULT, 0, &sound); //載入磁盤文件到內(nèi)存,(全部載入后返回)

  ERRCHECK(result);

  result = sound->getLength(&lenms,FMOD_TIMEUNIT_MS);

  ERRCHECK(result);

  result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);//播放

  ERRCHECK(result);

  Sleep(lenms);

  system->release();//釋放

  }

  //動畫功能函數(shù)

  void graph(int argc, char* argv[])

  {

  glutInit(&argc, argv);

  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  glutInitWindowSize(600,350);

  glutCreateWindow("日月地模型示例");

  glutReshapeFunc(ChangeSize);

  glutDisplayFunc(RenderScene);

  glutTimerFunc(500, TimerFunc, 1);

  Initial();

  glutMainLoop();

  }

  int main(int argc, char* argv[])

  {

  HANDLE hThread1;

  hThread1 = CreateThread(NULL,0,SoundProc,NULL,0,NULL);

  CloseHandle(hThread1);

  graph(argc,argv);

  Sleep(3000);

  return 0;

  }

  DWORD WINAPI SoundProc(

  LPVOID LPVIDEOPARAMETERS)

  {

  bcsound();

  return 0;

  }

【c語言實現(xiàn)多線程動畫程序】相關(guān)文章:

C語言程序的實現(xiàn)09-27

C語言的HashTable簡單實現(xiàn)10-12

C語言程序試題04-26

c語言入門經(jīng)典程序08-01

C語言經(jīng)典程序題09-17

c語言鏈接程序08-26

C語言程序介紹08-23

C語言程序的段06-14