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

ARToolkit例子中的simpleVRML.c改寫(三)

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


圖1   ARToolKit座標系統

(1)攝像機座標系與標識物座標系的關係。


(2)攝像機座標系與理性螢幕座標系的關係。


        其中 為攝像機座標系與標記物座標系的變換矩陣;C為攝像機引數,為已知量;M為標記物座標系,也就是物理座標系;R為3×3的單位正交矩陣;T為三維平移向量;f是攝像機的焦距;(x,y)是空間任意一點p的物理座標。

      標識卡和攝像機之間的關係非常重要,它們之間的轉換使多個座標系統的工作成為可能。在這些座標系統的基礎上,同樣可以得到任何兩個不同的座標系統之間的轉換關係。

     我在simpleVRML.c程式碼的static void Display(void)函式中添加了如下程式碼,得到標識卡2在標識卡1座標系裡面的轉移矩陣wmat2[3][4],其中(wmat2[0][3],wmat2[1][3],wmat2[2][3])是標示卡2在標示卡1座標系裡面的相對轉移矩陣。將其在控制檯輸出,觀察輸出的值,輸出結果如圖2所示,讓標識物2與標識物1之間的距離在某個範圍內,就觸發事件。

程式通過 arUtilMatInv()函式來對矩陣求逆,通過arUtilMatMul()函式來做一個矩陣乘法,即wmat2=gObjectData[1].trans*wmat1。

if( gObjectData[0].visible >= 0&& gObjectData[1].visible >= 0 ) {
        double  wmat1[3][4], wmat2[3][4];

        arUtilMatInv(gObjectData[0].trans, wmat1);
        arUtilMatMul(wmat1, gObjectData[1].trans, wmat2);
		printf("%8.4f,%8.4f,%8.4f\n",wmat2[0][3],wmat2[1][3],wmat2[2][3]);
		double dis=wmat2[0][3]*wmat2[0][3]+wmat2[1][3]*wmat2[1][3]+wmat2[2][3]*wmat2[2][3];
		if(dis<8000)
		{
			glTranslatef(300.0,100.0,100.0);
			arVrmlDraw(gObjectData[0].vrml_id);
		}

圖2   轉移矩陣wmat2的值         執行結果如圖3、圖4所示。圖3表示的是標識物2與標識物1之間的距離不在我定義的範圍內,不觸發任何事件。圖4表示的是標識物2與標識物1之間的距離在我定義的範圍內,就在沿x軸方向平移300mm,沿y軸方向平移100mm,沿z軸方向平移100mm的位置重新繪製一個茶壺。

                                        

   圖3   兩個標識物之間的距離不在某個範圍內                                                                圖4   兩個標識物之間的距離在某個範圍內,觸發事件