カメラ プレビューの上に opengl ビューを表示する拡張現実アプリを作成しようとしています。カメラのプレビューと OpenGL ビューを取得しました。センサー マネージャーからセンサー データを収集し、回転マトリックスを作成して OpenGL ビューに適用します。ここまでは順調ですね。横向きの電話のみを使用しています。しかし、ここに私の問題があります:
私はセンサーから回転行列を使用しています。それをopenglに適用してから、(0,0,0)ポイントの周りを一定に移動しているモデルを描画したいと思います。しかし、携帯電話を回転させると、もちろんオブジェクトの動きを追うことができますが、方向を変えると(携帯電話を右方向に回転させてから反対の左に変更すると仮定します。この瞬間、オブジェクトは彼のパスに沿って移動する必要がありますが、彼はその場にとどまり、少し後ろに移動します。
電話からの私のコードと画面:
private float[] rotationMatrix = new float[16];
onDrawFrame:
moveObjects(smoothedDeltaRealTime_ms);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glMultMatrixf(rotationMatrix, 0);
gl.glRotatef(90.0f, 1f, 0f, 0f);
drawObjects(gl);
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
ArOpenGlLogger.info("onSurfaceChanged " + width + "x" + height);
this.screenWidth = width;
this.screenHeight = height;
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Set color's clear-value
gl.glClearDepthf(1.0f); // Set depth's clear-value to farthest
gl.glEnable(GL10.GL_DEPTH_TEST); // Enables depth-buffer for hidden surface removal
gl.glDepthFunc(GL10.GL_LEQUAL); // The type of depth testing to do
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glShadeModel(GL10.GL_SMOOTH); // Enable smooth shading of color
gl.glDisable(GL10.GL_DITHER); // Disable dithering for better performance
gl.glEnable(GL10.GL_TEXTURE_2D); // Enable texture
}
protected void draw(GL10 gl) {
//loading textures
if(!isTextureLoaded) loadTexture(gl);
gl.glTranslatef(translation.getX(), translation.getY(), translation.getZ());
gl.glScalef(scale.getX(), scale.getY(), scale.getZ());
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, vertices.length / 3);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
センサー:
rootMeanSquareBuffer(bufferedAccelerometrData, accelerometrData);
rootMeanSquareBuffer(bufferedMagneticFieldData, magneticFieldData);
SensorManager.getRotationMatrix(rotationMatrix, null, bufferedAccelerometrData, bufferedMagneticFieldData);
if(deviceOrientation == ORIENTATION_LANDSCAPE) {
float[] result = new float[16];
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, result);
sensorCallback.onNewRotationMatrix(result);
}
else sensorCallback.onNewRotationMatrix(rotationMatrix);
private void rootMeanSquareBuffer(float[] target, float[] values) {
final float amplification = 200.0f;
float buffer = 20.0f;
target[0] += amplification;
target[1] += amplification;
target[2] += amplification;
values[0] += amplification;
values[1] += amplification;
values[2] += amplification;
target[0] = (float) (Math.sqrt((target[0] * target[0] * buffer + values[0] * values[0]) / (1 + buffer)));
target[1] = (float) (Math.sqrt((target[1] * target[1] * buffer + values[1] * values[1]) / (1 + buffer)));
target[2] = (float) (Math.sqrt((target[2] * target[2] * buffer + values[2] * values[2]) / (1 + buffer)));
target[0] -= amplification;
target[1] -= amplification;
target[2] -= amplification;
values[0] -= amplification;
values[1] -= amplification;
values[2] -= amplification;
}
デバイスからの画面: