【问题标题】:Get orientation device in the iPhone for Opengl Es在 iPhone 中为 Opengl Es 获取方向设备
【发布时间】:2011-08-22 12:17:01
【问题描述】:

我正在尝试转换地磁和加速度计以在 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 中绘制的对象出现了两次。

【问题讨论】:

  • 我希望我足够聪明,知道这意味着什么。大声笑。

标签: iphone opengl-es rotation accelerometer magnetometer


【解决方案1】:

您看过 Apple 的 GLGravity 示例代码吗?通过操纵模型视图矩阵以响应加速度计输入的变化,它的作用与您在此处想要的非常相似。

【讨论】:

  • 是的,我的代码更多地基于 GLGravity 示例,但我还需要修改的地磁数据有方向。
【解决方案2】:

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

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

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

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

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

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

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

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

【讨论】:

  • 非常感谢您的解释,问题出在 iPhone 上,现在可以正常工作了。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多