2011-05-10 42 views
1

我想轉換地磁和加速度計在opengl ES1中旋轉相機,我發現了一些來自android的代碼,並改變了iPhone的代碼,實際上它或多或少地工作,但也有一些失誤,我可不是能找到這個錯誤,我把代碼,還調用OpenGL的沙一段:glLoadMatrixf((GLfloat*)matrix);在iPhone上獲取定位設備的Opengl Es

- (void) GetAccelerometerMatrix:(GLfloat *) matrix headingX: (float)hx headingY:(float)hy headingZ:(float)hz; 
{ 

    _geomagnetic[0] = hx * (FILTERINGFACTOR-0.05) + _geomagnetic[0] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[3] * (0.55); 
    _geomagnetic[1] = hy * (FILTERINGFACTOR-0.05) + _geomagnetic[1] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[4] * (0.55); 
    _geomagnetic[2] = hz * (FILTERINGFACTOR-0.05) + _geomagnetic[2] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[5] * (0.55); 

    _geomagnetic[3]=_geomagnetic[0] ; 
    _geomagnetic[4]=_geomagnetic[1]; 
    _geomagnetic[5]=_geomagnetic[2]; 


     //Clear matrix to be used to rotate from the current referential to one based on the gravity vector 
    bzero(matrix, sizeof(matrix)); 



    //MAGNETIC 
    float Ex = -_geomagnetic[1];  
    float Ey =_geomagnetic[0]; 
    float Ez =_geomagnetic[2]; 

    //ACCELEROMETER 
    float Ax= -_accelerometer[0]; 
    float Ay= _accelerometer[1] ; 
    float Az= _accelerometer[2] ; 


    float Hx = Ey*Az - Ez*Ay; 
    float Hy= Ez*Ax - Ex*Az; 
    float Hz = Ex*Ay - Ey*Ax; 

    float normH = (float)sqrt(Hx*Hx + Hy*Hy + Hz*Hz); 


    float invH = 1.0f/normH; 
    Hx *= invH; 
    Hy *= invH; 
    Hz *= invH; 

    float invA = 1.0f/(float)sqrt(Ax*Ax + Ay*Ay + Az*Az); 
    Ax *= invA; 
    Ay *= invA; 
    Az *= invA; 

    float Mx = Ay*Hz - Az*Hy; 
    float My = Az*Hx - Ax*Hz; 
    float Mz = Ax*Hy - Ay*Hx; 

    // if (mOut.f != null) { 

    matrix[0] = Hx; matrix[1] = Hy; matrix[2] = Hz; matrix[3] = 0; 
    matrix[4] = Mx; matrix[5] = My; matrix[6] = Mz; matrix[7] = 0; 
    matrix[8] = Ax; matrix[9] = Ay; matrix[10] = Az; matrix[11] = 0; 
    matrix[12] = 0;  matrix[13] = 0;  matrix[14] = 0; matrix[15] = 1; 


} 

非常感謝您的幫助。

編輯:iPhone它在橫向方向永久,我知道有什麼地方是錯誤的,因爲在Opengl Es繪的對象出現兩次。

+0

我希望我足夠聰明,知道這一切意味着什麼。大聲笑。 – 2011-05-10 14:02:00

回答

1

我無法找到任何發佈代碼的問題,並會提示問題在別處。如果有幫助,我發佈的代碼分析如下:

處理_geomagnetic 0-5的前六行代碼會生成一個非常簡單的低頻濾波器,它假定您定期調用該方法。所以你最終得到了一個磁力計矢量的版本,希望去掉高頻抖動。

bzero歸零結果,準備積累。

直到聲明和賦值爲Hz的行採用磁力計和加速度計向量並執行交叉乘積。所以H(x,y,z)現在是一個與加速度計(推測爲「下」)和磁力計(它將向前+某些向上)成直角的向量。稱之爲側向量。

invH和invA的東西,由invA乘以Az確保側面和加速度計/向下矢量的單位長度。然後創建M(x,y,z)作爲側向矢量和向下矢量的叉積(即與這兩個矢量成直角的矢量)。然後創建M(x,y,z)。所以它給出了前向量。

最後,這三個向量用於填充矩陣,利用正交3×3矩陣的逆矩陣是其轉置的事實(儘管這是事物佈局方式隱藏的事情 - 注意數組索引)。你實際上直接在矩陣中設置所有的東西,所以bzero在純粹的結果條件中是不必要的。

glLoadMatrixf然後是正確的使用方法,因爲這是您在OpenGL ES 1.x中乘以任意列主矩陣的方法。

+0

非常感謝您的解釋,問題出在iPhone上,現在工作正常。 :D – Gustavo 2011-05-12 06:50:28

2

你看過蘋果的GLGravity示例代碼嗎?它通過操縱模型視圖矩陣來響應加速度計輸入的變化,從而做出與您想要的內容非常相似的內容。

+0

是的,我的代碼基於GLGravity示例中的更多,但我還需要修改地磁數據的方向。 – Gustavo 2011-05-11 06:30:17