2011-05-10 22 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