首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenGL中使用SensorManager进行旋转?

在OpenGL中使用SensorManager进行旋转?
EN

Stack Overflow用户
提问于 2011-09-01 19:06:25
回答 1查看 1.1K关注 0票数 3

我正在构建一个非常标准的AR应用程序,它可以覆盖相机上的内容,但在使用SensorManager时遇到了问题。我基本上是尝试从传感器管理器获取旋转矩阵,然后调用glMultMatrix来相应地旋转所有内容。在SensorManager.getRotationMatrix的文档中看起来这是可能的。然而,当我使用旋转矩阵乘法时,一切都变得扭曲和移动,不像你看到其他ar应用程序所期望的那样。下面是我的一些代码:

代码语言:javascript
复制
private float[] gravity = new float[3];
private float[] geomagnetic = new float[3];
private float filteringFactor = 0.01f;
private float[] rotationMatrixOut = new float[16];

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        geomagnetic[0] = event.values[0] * filteringFactor + geomagnetic[0] * (1.0f - filteringFactor);
        geomagnetic[1] = event.values[1] * filteringFactor + geomagnetic[1] * (1.0f - filteringFactor);
        geomagnetic[2] = event.values[2] * filteringFactor + geomagnetic[2] * (1.0f - filteringFactor);
    } else if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        gravity[0] = event.values[0] * filteringFactor + gravity[0] * (1.0f - filteringFactor);
        gravity[1] = event.values[1] * filteringFactor + gravity[1] * (1.0f - filteringFactor);
        gravity[2] = event.values[2] * filteringFactor + gravity[2] * (1.0f - filteringFactor);
    }

    SensorManager.getRotationMatrix(rotationMatrixOut, null, gravity, geomagnetic);
}

我也尝试过使用SensorManager.remapCoordinateSystem,但没有成功。我的绘图代码如下,这是非常标准的东西,我注释掉了lookat,因为我不确定这是不是造成了麻烦

代码语言:javascript
复制
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    //GLU.gluLookAt(gl, mCamera.position.x, mCamera.position.y, mCamera.position.z, 
    //                mCamera.target.x, mCamera.target.y, mCamera.target.z,
    //                mCamera.up.x, mCamera.up.y, mCamera.up.z);

    gl.glMultMatrixf(rotationMatrixOut, 0);


    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    gl.glLineWidth(1.0f);

    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);

    gl.glDrawArrays(GL10.GL_LINES, 0, 2 * 201 * 2);

我为此失眠太多了,如果有人能帮上忙的话,我会非常感激的。谢谢

EN

回答 1

Stack Overflow用户

发布于 2011-09-01 21:14:37

只是猜测,但可能是,您从SensorManager收到的数据是按行主序排列的吗?OpenGL要求数据按列的主序排列,所以如果您有一个传递给OpenGL的行主序矩阵,那么它会被解释为转置。

你是对的,你不需要gluLookAt在那里(假设你,即设备在原点,并显示它周围的世界)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7269424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档