1. 程式人生 > >ARTOOLKIT例子中的simpleVRML.c改寫(一)

ARTOOLKIT例子中的simpleVRML.c改寫(一)

       simpleVRML這個例子比較特殊,它使用的框架與之前的例子不同。VRML(Virtual Reality Modeling Language)即虛擬現實建模語言。是一種用於建立真實世界的場景模型或人們虛構的三維世界的場景建模語言,也具有平臺無關性。是目前Internet上基於 WWW的三維互動網站製作的主流語言。VRML的場景模型檔案的副檔名為.wrl,wrl檔案是一種虛擬現實文字格式檔案,可以用VrmlPad軟體編輯,也可以在3Ds  MAX軟體中畫3D圖形,然後匯出為.wrl型別的檔案。(simpleVRML.c原始程式碼的理解請檢視我部落格裡的一篇文章“Artoolkit的例子simpleVRML詳解”,這裡講的是我修改之後的程式)

      該例子的標識和模型路徑為“Data/object_data_vrml”,內容如下。第1行表示pattern被識別的個數為2;第3行表示第一個pattern的模型路徑為“Wrl/Teapot.dat”,標識路徑為“Data/patt.hiro”,標識的寬度為80,標識的中心座標為(0,0);第5行表示第一個pattern的模型路徑為“Wrl/model.dat”,標識路徑為“Data/patt.kanji”,標識的寬度為80,標識的中心座標為(0,0)。(如果想使用自己的模型和標識,就要修改這個檔案的內容)

#the number of patterns to be recognized 2

#pattern 1VRML	Wrl/Teapot.dat Data/patt.hiro  80.0  0.0 0.0

#pattern 2VRML	Wrl/model.dat  Data/patt.kanji 80.0 0.0 0.0

 


我在檔案裡添加了以下程式碼:
static void   drawCuboid()
{
	glColor3f(0,1,0);
	glBegin(GL_LINE_LOOP);	  		
        glVertex3f(150.0f,100.0f,0.0f);  
        glVertex3f(-150.0f,100.0f,0.0f);  
        glVertex3f(-150.0f,100.0f,250.0f);  
        glVertex3f(150.0f,100.0f,250.0f);
		glVertex3f(150.0f,-100.0f,250.0f);
		glVertex3f(-150.0f,-100.0f,250.0f);  
		glVertex3f(-150.0f,-100.0f,0.0f);
		glVertex3f(150.0f,-100.0f,0.0f); 
	glEnd();

	glBegin(GL_LINES);
		glVertex3f(150.0f,-100.0f,0.0f);  
		glVertex3f(150.0f,-100.0f,250.0f);
		glVertex3f(-150.0f,-100.0f,0.0f); 
		glVertex3f(-150.0f,100.0f,0.0f);
		glVertex3f(-150.0f,-100.0f,250.0f);  
		glVertex3f(-150.0f,100.0f,250.0f);
		glVertex3f(150.0f,100.0f,0.0f);  
		glVertex3f(150.0f,100.0f,250.0f);
	glEnd();
}
在static void Display(void)函式的某一段中新增一行程式碼如下,用來繪製線狀的長方體。
for (i = 0; i < gObjectDataCount; i++) //對標識進行遍歷
{
	if ((gObjectData[i].visible != 0) && (gObjectData[i].vrml_id >= 0)) 
	{   //如果該標識被設定為可見(該設定在Idle()函式中完成)且ID正確那麼就執行以下程式碼
		//fprintf(stderr, "About to draw object %i\n", i);
		
		arglCameraViewRH(gObjectData[i].trans, m, VIEW_SCALEFACTOR_4);
		glLoadMatrixd(m);

		arVrmlDraw(gObjectData[i].vrml_id);//根據前面載入的模型ID繪製模型
		
		drawCuboid();//新增的程式碼,繪製線性長方體
		}			
}
我修改程式碼之後,執行的結果如圖1所示。我們可以看到在patt.hiro標識上顯示的是一個茶壺,在patt.kanji標識上顯示的是一個球和圓柱的組合體,而且我還給每個模型都添加了一個線狀的長方體。
圖1  修改simpleVRML.c後的執行結果

相關推薦

ARTOOLKIT例子simpleVRML.c改寫

       simpleVRML這個例子比較特殊,它使用的框架與之前的例子不同。VRML(Virtual Reality Modeling Language)即虛擬現實建模語言。是一種用於建立真實世界的場景模型或人們虛構的三維世界的場景建模語言,也具有平臺無關性。是目前I

ARToolkit例子simpleVRML.c改寫

        ARToolkit提供了標識在攝像機座標系統中的位置,可以使用opengl矩陣系統計算出虛擬物體的位置。標識座標系統有著和opengl座標系統一樣的方位。因此任何應用於與標識關聯的物體的轉換都應遵循opengl的轉換規則。ARToolKit所使用的座標系統如

ORB-SLAM2C++技巧

打算好好啃ORB-SLAM原始碼,接下來的LSD、SVO其實就是從特徵點法換成了光流法(直接法),但是整體的框架大同小異,所以打算兩週時間啃完,並將學習到的C++技巧總結下來,這樣對於C++也會有新的理解。 每章5個技巧,怕什麼真理無窮,進一寸有進一寸的歡喜。 一、多執行緒Thread

GUN C的socket學習

ipp 區分 如果 raw 文件表 一起 通訊 res 概念   socket是用於通信的工具。   套接字其實是一個廣義上的進程間通信的信道。就像pipe一樣,在GUN環境下socket也被用一個文件表示。不同的socket文件可以用於不同的進程間通信,甚至可以用來在網絡

C++的指標問題

在C++語言中指標是個非常重要又神奇的東西,搞懂指標就非常的重要。下面首先介紹一下指標的基本作用: 指標是對某一型別資料(可以是int、char、string、double以及結構或類……)的間接使用。指標本質是儲存變數的地址。其表示符號為” * “,此符號

C++嵌入IE瀏覽器

    最近專案中用html 來做介面,也就折騰了一下在wxwidget中嵌入瀏覽器的若干細節工作,mfc也基本是類似的,由於wxwidget中已經做了一個封裝wxie,但是開發過程中也遇到了不少問題,在此做一下總結:  ie邊框 及上下文選單    普通嵌入到程式裡面的

深入理解C#的泛型

為什麼要有泛型?   請大家思考一個問題:由你來實現一個最簡單的氣泡排序演算法,如果沒有使用泛型的經驗,可能會毫不猶豫的寫出以下程式碼: public class SortHelper { //引數為int陣列的氣泡排序 publi

C++ 模板的型別獲取

C++ 模板中的型別獲取 1. 型別判斷 嚴格型別比較:std::is_same<T1, T2>::value cout << std::is_same<int, int>::value << endl

【物流系統】——C#Oracle批量匯入

前提     匯入資料量1W,因為在小編做這個xml匯入之前系統中已經有execl匯入了,小編也沒多想,就按照前人的封裝做了一版,數量不大的時候使用起來完全沒有毛病。     封裝在DbHelper中,執行多條SQL語句,實現資料庫事務的方法。資料庫用的Oracle

[面試] C++ STL—— 向一個vector新增N個元素,平均的新增的效能是?

考慮如下的程式碼輸出: int N = 100; vector<int> v; set<int> s; for (int i = 0; i < N; ++i) { s.insert(v.capacity());

C++ 繼承

c++ 繼承(一)C++繼承的標準寫法:class BaseMonster { public: string name; string skill; uint32_t hp; void attack() { cout << "Base ::

java-web生成文檔

all 檢查 download com ftl 緩沖 getc cor tps 基於Java的解決方案也是很多的,包括使用Jacob、Apache POI、Java2Word、iText等各種方式,其實在從Office 2003開始,就可以將Office文檔轉換成XML文件

phpcurl的使用

lookup mpat com 2.0 libcurl borde 基於 測試 字符串 cURL 是一個利用URL語法規定來傳輸文件和數據的工具,PHP的curl是通過libcurl庫與服務器使用各種類型的協議,如HTTP、FTP、TELNET等。 PHP curl函數

C++ 模板

c++ 模板C++模板類似與C#/Java當中的泛型,即可使用同樣的代碼實現不同的功能。效果類似於繼承(父對象指針指向子指針)。一 : 函數模板#include <iostream> using namespace std; template<typename T>//<type

OpenGL在MFC的使用總結——基本框架

palette 接受 white 要求 無效 結構 del 一次 是你 項目中要畫3D顯示的模型,於是要用到OpenGL,加上是在MFC中,並且是在MFC中的ActiveX中使用。再並且鑒於他們程序主框架的設定。常規的方法還不一定能實現。所以還是查過不少資料,在此一一總

Java的反射機制

erl void port 令行 sage [0 ray 輸出 我們 基本概念   在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法?   答案是肯定的。   這種動態獲取類的信息以及動態調用對象的方法的功能

JAVA的枚舉

enum 枚舉 在實際編程中,往往存在著這樣的“數據集”,它們的數值在程序中是穩定的,而且“數據集”中的元素是有限的。例如星期一到星期日七個數據元素組成了一周的“數據集”,春夏秋冬四個數據元素組成了四季的“數據集”。在Java中想表示這種數據集最容易想到的寫法可能是這樣,我們以表示一周五天的工作日來舉

GTK+重拾--09 GTK+的組件

nec face 可見 ref init lines efault borde rust (一):寫在前面 在這篇文章中主要介紹了GTK+程序中的各種構件,這是解說構件的第一個部分,另外一部分將在下一個小節中講到。構件是建立一個GUI程序的基礎。在

Java的線程

java線程一、線程與進程 談到線程,那就不得不提進程,很久之前其實並沒有線程,只有進程,當一個程序需要運行的時候,必然需要使用系統資源和CPU,因此進程就擔任了對一個應用程序進行資源分配以及CPU調度這兩項職責。後來,為了進一步提高並發執行和資源利用的效率,提出了線程的概念,將進程作了細分,進程將負責資源

javascript的DOM介紹

item 檢測 turn 及其 篩選 層次 proto nbsp log 一、基礎知識點 1、DOM是文檔對象模型,是針對HTML和XML文檔的一個API(應用程序接口) 2、DOM描繪了一個層次化的節點數,允許開發人員進行添加,移除個修改等操作 3、IE瀏覽器中所有的DO