【问题标题】:How do you convert quaternion/accelerometer data to opengl usable data如何将四元数/加速度计数据转换为 opengl 可用数据
【发布时间】:2015-03-14 18:23:16
【问题描述】:

我有一些来自传感器设备的数据,即加速度计 x、y、z 和四元数。使用此信息,我想在 Android OpenGL 视图中呈现“线条图像”。有人可以帮助我了解如何将加速度值转换为 OpenGL glTranslatef 和 glRotatef 函数可以使用的部分。

【问题讨论】:

    标签: android opengl-es sensor-fusion


    【解决方案1】:

    您不应该使用已弃用的 gltranslate 或 glrotate。而是直接管理正确的转换矩阵。

    可以通过以下方式将四元数转换为矩阵:(sourced from my previous code)

    float[] quatToMat(quaternion q, float* result)
    {
        //based on algorithm on wikipedia
        // http://en.wikipedia.org/wiki/Rotation_matrix#Quaternion
        float w = q.scalar ();
        float x = q.x();
        float y = q.y();
        float z = q.z();
    
        float n =  x*x + y*y + z*z + w*w;
        float s =  n == 0?  0 : 2 / n;
        float wx = s * w * x, wy = s * w * y, wz = s * w * z;
        float xx = s * x * x, xy = s * x * y, xz = s * x * z;
        float yy = s * y * y, yz = s * y * z, zz = s * z * z;
    
        return new float[]{ 1 - (yy + zz),         xy + wz ,         xz - wy ,0,
                                 xy - wz ,    1 - (xx + zz),         yz + wx ,0,
                                 xz + wy ,         yz - wx ,    1 - (xx + yy),0,
                                 0 ,               0 ,               0 ,1  };
    }
    

    如果您仍想使用固定函数管道,请将其推送到 glMultMatrix。

    【讨论】:

    • gl.glTranslatef(q.X, q.Y, q.Z); rv = computeRotationVectorFromQ(q) gl.glRotatef(rv.a, rv.x, rv.y, rv.z);目前这就是我使用数据的方式。如果我遵循您的建议,我应该使用什么 OpenGL 函数来应用转换。在此先感谢:-)
    • multMatrix 将具有与首先从四元数中获取角度轴相同的结果,只是更有效。当人们谈论四元数并且仍然会在第一关时抢回角轴时,我讨厌它。
    • @Soundararajan:在现代 GL (3.0+) 和 GL ES (2.0+) 中,glTranslatefglRotatef 等固定功能转换已消失。如果将其转换为任意矩阵,则可以将其直接传递给着色器(ES 2.0 需要)或在使用 ES 1.x 时调用glMultMatrixf (...)。您提到了 Android,所以我怀疑您使用的是 ES 1.x 或 2.0+。
    • @AndonM.Coleman,谢谢。我使用 ES 2.0。我会试试你的建议。 :-)
    猜你喜欢
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多