1

我正在尝试转换地磁和加速度计以在opengl ES1中旋转相机,我从android中找到了一些代码并将此代码更改为iPhone,实际上它或多或少都在工作,但是有一些错误,我不能为了找到这个错误,我放了代码,也是对 Opengl Es1 的调用: glLoadMatrixf((GLfloat*)matrix);

- (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 中绘制的对象出现了两次。

4

2 回答 2

2

Have you looked at Apple's GLGravity sample code? It does something very similar to what you want here, by manipulating the model view matrix in response to changes in the accelerometer input.

于 2011-05-10T15:49:49.753 回答
1

我找不到发布的代码有任何问题,并建议问题出在其他地方。如果有帮助,我对发布的代码的分析是:

前六行处理 _geomagnetic 0–5,影响一个非常简单的低频滤波器,假设您定期调用该方法。所以你最终得到了一个磁力计矢量的版本,希望能消除高频抖动。

bzero 将结果归零,准备好累加。

直到声明和分配给 Hz 的行采用磁力计和加速度计矢量并执行叉积。因此,H(x, y, z) 现在是与加速度计(假定为“向下”)和磁力计(将向前 + 一些向上)都垂直的向量。称其为侧向量。

invH 和 invA 的东西,一直到 Az 与 invA 的乘积,确保了边和加速度计/下向量是单位长度的。

然后创建M(x, y, z),作为侧向向量和向下向量的叉积(即,与这两个向量成直角的向量)。所以它给出了前向量。

最后,这三个向量用于填充矩阵,利用正交 3x3 矩阵的逆矩阵是它的转置这一事实(尽管这有点隐藏在事物的布局方式上——注意数组索引)。您实际上直接在矩阵中设置了所有内容,因此 bzero 在纯粹的结果方面不是必需的。

glLoadMatrixf然后是正确的使用方法,因为这是在 OpenGL ES 1.x 中乘以任意列主矩阵的方式。

于 2011-05-10T14:31:59.870 回答