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(也是剛體模型),OCULUS(Oculus Rift頭戴式顯示器)四個第三方模塊扎即,也是對CHAI3D基本項目的補充吞获。
CHAI3D的配置非常簡單,不用配置環(huán)境變量谚鄙,主要是在新建項目的配置的鏈接器的附加依賴項里添加chai3d.lib各拷,OpenGL32.lib,glu32.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文件夾下有三個例程隅肥,BULLET,OCULUS袄简,ODE文件夾下有7個例程腥放,每個例程已經(jīng)提前配置好了,直接可以運行绿语,同時可以通過研究這些例程來學(xué)習(xí)CHAI3D秃症。在最下面還有一個EXTRA文件夾,里面是窗口管理的第三方庫GLFW吕粹,窗口管理除了這個种柑,CHAI3D中還有freeglut,SDL2昂芜。
-
二莹规、利用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è)就是這么搞的琼娘,太煩了峭弟,不想寫了,等下次想寫的時候再說吧
?