用CHAI3D做完畢設(shè)后的一點整理

圖片轉(zhuǎn)自360圖片

CHAI3D的學(xué)習(xí)

  • 一昏苏、CHAI3D 的一些介紹

    CHAI3D 是一個C++庫鸥咖,它本身就是一個C++項目谤祖,官網(wǎng)里有它詳細(xì)的英文介紹CHAI3D官網(wǎng),這里關(guān)于它的特點不做贅述甜孤。這里只是用直白的語言來幫助剛接觸CAHI3D的人更快的了解协饲,CHIA3D項目里面包含了18個模塊(就是文件),

    圖片來自CHAI3D官網(wǎng)

    每個模塊里的包含一些.h和.cpp文件缴川,上面封裝了一個個類茉稠。最新的3.2.0版本將所有的相關(guān)類都放到名為chai3d 的命名域,格式如下:

    using namespace std;
    namespace chai3d {
        cAudioBuffer::cAudioBuffer()
        {
          public:...
        }
    }
    

    CHAI3D還包含了GEL形變模型)把夸,BULLET剛體模型)战惊,ODE也是剛體模型),OCULUSOculus Rift頭戴式顯示器)四個第三方模塊扎即,也是對CHAI3D基本項目的補充吞获。

    CHAI3D配置非常簡單,不用配置環(huán)境變量谚鄙,主要是在新建項目的配置的鏈接器的附加依賴項里添加chai3d.lib各拷,OpenGL32.libglu32.lib闷营,glfw.lib四個靜態(tài)鏈接庫烤黍,并在附加庫目錄里添加對應(yīng)的相對路徑,如果添加第三方模塊傻盟,也要添加相應(yīng)的lib文件速蕊。

    當(dāng)然,你也可以不用新建項目配置娘赴,直接在下載的例程上編寫就好规哲。

    官方提供的3.2.0版本的CHAI3D文件解壓后如下圖所示,

    原創(chuàng)
    原創(chuàng)

    直接打開sln文件诽表,

    原創(chuàng)

    CAHI3D文件加下有31個例程唉锌,GEL文件夾下有三個例程隅肥,BULLETOCULUS袄简,ODE文件夾下有7個例程腥放,每個例程已經(jīng)提前配置好了,直接可以運行绿语,同時可以通過研究這些例程來學(xué)習(xí)CHAI3D秃症。在最下面還有一個EXTRA文件夾,里面是窗口管理的第三方庫GLFW吕粹,窗口管理除了這個种柑,CHAI3D中還有freeglutSDL2昂芜。

  • 二莹规、利用CAHI3D編寫應(yīng)用的一般結(jié)構(gòu)

    一個CAHI3D程序,一般包括幾個模塊(模塊這個詞當(dāng)然是我說的泌神,只是因為看著高大上而已良漱,實質(zhì)你明白就是編寫幾個函數(shù),然后依次放到main函數(shù)里)欢际,那么首先說必須有的幾個函數(shù)吧母市。

    • 其一 初始化glfw庫 ,就是調(diào)用glfw庫(也可以是上面說的其他的庫)創(chuàng)建窗口损趋,這個每個例程里都一樣患久,你直接拿過來用就可以了,注意設(shè)置一下窗口的一些參數(shù)就可以了。

    • 其二 創(chuàng)建虛擬世界,說的好像很高大上四敞, 不懂,來篙挽,簡單點告訴你,就是實例化幾個類指針镊靴。在上文所說的18個模塊(不懂铣卡,往上看)里,有一個World模塊偏竟,里面封裝了一個cWorld類煮落,還有盒子、球踊谋、圓柱等基元(就是最基礎(chǔ)的)形狀模型和網(wǎng)格模型蝉仇。還有Camera模塊Lighting Properties模塊,每個虛擬世界里都必須添加至少一個攝像頭和一個燈光來渲染場景,當(dāng)然量淌,攝像頭和燈光的有許多屬性可以設(shè)置骗村,下面只是簡單添加:

      // a world that contains all objects of the virtual environment
      cWorld* world;
      // create a new world.
      world = new cWorld(); 
      // create a camera and insert it into the virtual world
      camera = new cCamera(world);
      world->addChild(camera);
      // create a directional light source
      light = new cDirectionalLight(world);
      // insert light source inside world
      world->addChild(light);
      
    • 其三 連接設(shè)備嫌褪,這里呀枢,也有一點講究, 18個模塊里有一個Device模塊 封裝了CAHI3D支持的所有設(shè)備的信息笼痛,還有一個Handler模塊調(diào)用Device模塊里的信息裙秋,接下來有兩種方式操作它,一種直接連接設(shè)備缨伊,輸入輸出設(shè)備信息摘刑,另一種是通過一個代理工具(18個模塊里有一個Haptic Tools模塊),

      // create a haptic device handler
      handler = new cHapticDeviceHandler();
      // get a handle to the first haptic device
      handler->getDevice(hapticDevice, 0);
      //(1)直接連接設(shè)備
      // open a connection to haptic device
      hapticDevice->open();
      // calibrate device (if necessary)
      hapticDevice->calibrate();
      //(2)通過tool工具連接刻坊,tool類直接內(nèi)置了直接連接社別的程序
      // a virtual tool representing the haptic device in the scene
      cToolCursor* tool;
      // create a 3D tool and add it to the world
      tool = new cToolCursor(world);
      
    • 其四 創(chuàng)建物體枷恕,這一部分,其實可以算作創(chuàng)建虛擬世界里面谭胚,但是它又不是必須的徐块, 沒有它程序也可以運行,它又是最重要的灾而,因為我們開發(fā)的時候就是在這塊發(fā)揮所有的想象力胡控。下面簡單創(chuàng)建一個球體:

      // create a sphere 
      sphere = new cShapeSphere(0.01);
      // insert sphere inside world
      world->addChild(sphere);
      
    • 其五 圖像渲染,渲染攝像頭看到的場景旁趟,先渲染后層昼激,再渲染前層。很多時候锡搜,我們也在攝像頭上添加一些文本橙困,圖像等,然后在這里設(shè)置位置大小耕餐,這樣可以實時動態(tài)顯示一些值或者圖像凡傅。

      // update position data
      labelHapticDevicePosition->setText(hapticDevicePosition.str(3));
      // update haptic and graphic rate data
      labelRates->setText(cStr(freqCounterGraphics.getFrequency(), 0) + " Hz / " +
      cStr(freqCounterHaptics.getFrequency(), 0) + " Hz");
      // update position of label
      labelRates->setLocalPos((int)(0.5 * (width - labelRates->getWidth())), 15);
      /////////////////////////////////////////////////////////////////////
      // RENDER SCENE
      /////////////////////////////////////////////////////////////////////
      // update shadow maps (if any)
      world->updateShadowMaps(false, mirroredDisplay);
      // render world
      camera->renderView(width, height);
      // wait until all OpenGL commands are completed
      glFinish();
      // check for any OpenGL errors
      GLenum err;
      err = glGetError();
          if (err != GL_NO_ERROR) cout << "Error:  %s\n" << gluErrorString(err);
      
    • 其六 觸覺渲染,這一模塊作為子進程蛾方,很重要的一部分像捶,這里要與設(shè)備進行交互。如果是沒有用tools工具的桩砰,需要自己寫交互程序拓春,反之,這塊特別簡單亚隅,tools工具早已內(nèi)置了所有的算法和力的碰撞硼莽,它會自動計算你在創(chuàng)建物體模塊里添加的所有力的屬性。函數(shù)如下:

      void updateHaptics(void)
      {
          // simulation in now running
          simulationRunning  = true;
          simulationFinished = false;
      
          // main haptic simulation loop
          while(simulationRunning)
          {
              // compute global reference frames for each object
              world->computeGlobalPositions(true);
      
              // update position and orientation of tool
              tool->updateFromDevice();
      
              // compute interaction forces
              tool->computeInteractionForces();
      
              // send forces to haptic device
              tool->applyToDevice();
      
              // signal frequency counter
              freqCounterHaptics.signal(1);
          }
          
          // exit haptics thread
          simulationFinished = true;
      }
      
    • 其七 添加進程 ,當(dāng)編寫完圖像渲染模塊和觸覺渲染模塊后懂鸵,需要把他們兩個組合到一塊偏螺,這里有一個System模塊里的cThread類,將觸覺觸覺渲染模塊添加到子進程匆光,然后在一個循環(huán)里添加圖像渲染模塊套像,函數(shù)如下:

      // create a thread which starts the main haptics rendering loop
      hapticsThread = new cThread();
      hapticsThread->start(updateHaptics, CTHREAD_PRIORITY_HAPTICS);
      // setup callback when application exits
      atexit(close);
      //--------------------------------------------------------------------------
      // MAIN GRAPHIC LOOP
      //--------------------------------------------------------------------------
      // call window size callback at initialization
      windowSizeCallback(window, width, height);
      // main graphic loop
      while (!glfwWindowShouldClose(window))
      {
           // get width and height of window
           glfwGetWindowSize(window, &width, &height);
           // render graphics
           updateGraphics();
           // swap buffers
           glfwSwapBuffers(window);
           // process events
           glfwPollEvents();
           // signal frequency counter
           freqCounterGraphics.signal(1);
      }
      // close window
      glfwDestroyWindow(window);
      // terminate GLFW library
      glfwTerminate();
      
    • 其八 中斷函數(shù),基于GLFW的包括按鍵中斷终息,鼠標(biāo)中斷夺巩,這個都是輔助功能,例程中都有模板周崭,你可以直接在程序里面添加你想實現(xiàn)的功能柳譬,不多做介紹(懶得寫了)。

    最后续镇,把這些模塊放到main函數(shù)里面就可以了美澳,一個CHAI3D程序就寫好了,看著多摸航,其實大部分都是模板上的制跟,如果想自己實現(xiàn)又高又大又上的功能,那得在模板之外自己再琢磨琢磨忙厌,CHAI3D提供的各種類凫岖,各種功能函數(shù)已經(jīng)足夠多,老實說那些例程真的只是用了很少一部分逢净,騷年們(我也是)想要真正學(xué)好學(xué)精哥放,個人感覺要除了精通例程,還要舉一反三爹土,多轉(zhuǎn)幾下定義甥雕,開動小腦筋,一直添加功能(與君共勉)胀茵。

  • 三社露、自定義類,實現(xiàn)多個界面轉(zhuǎn)換

    這個是我的畢設(shè)就是這么搞的琼娘,太煩了峭弟,不想寫了,等下次想寫的時候再說吧

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脱拼,一起剝皮案震驚了整個濱河市瞒瘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熄浓,老刑警劉巖情臭,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡俯在,警方通過查閱死者的電腦和手機竟秫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跷乐,“玉大人肥败,你說我怎么就攤上這事∨常” “怎么了拙吉?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵潮孽,是天一觀的道長揪荣。 經(jīng)常有香客問我,道長往史,這世上最難降的妖魔是什么仗颈? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮椎例,結(jié)果婚禮上挨决,老公的妹妹穿的比我還像新娘。我一直安慰自己订歪,他們只是感情好脖祈,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刷晋,像睡著了一般盖高。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眼虱,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天喻奥,我揣著相機與錄音,去河邊找鬼捏悬。 笑死撞蚕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的过牙。 我是一名探鬼主播甥厦,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寇钉!你這毒婦竟也來了刀疙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摧莽,失蹤者是張志新(化名)和其女友劉穎庙洼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡油够,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年蚁袭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片石咬。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡揩悄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鬼悠,到底是詐尸還是另有隱情删性,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布焕窝,位于F島的核電站蹬挺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏它掂。R本人自食惡果不足惜巴帮,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虐秋。 院中可真熱鬧榕茧,春花似錦、人聲如沸客给。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靶剑。三九已至蜻拨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抬虽,已是汗流浹背官觅。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阐污,地道東北人休涤。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像笛辟,于是被迫代替她去往敵國和親功氨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容