カメラに何かをオーバーレイするかなり標準的なARアプリを作成していますが、SensorManagerの操作に問題があります。基本的に、センサーマネージャーから回転行列を取得し、glMultMatrixを呼び出して、それに応じてすべてを回転させようとしています。SensorManager.getRotationMatrixのドキュメントでは、これが可能であるように見えます。ただし、回転行列を乗算すると、他のarアプリを表示する場合とは異なり、すべてが厄介になり、動き回ります。私は以下のいくつかのコードを手に入れました:
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の原因をコメントアウトしました
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);
誰かがそれを大いに感謝するのを手伝ってくれるなら、私はこれであまりにも多くの睡眠を失っています。ありがとう