【发布时间】:2011-06-17 11:02:01
【问题描述】:
我在 OpenGL for Android 中迈出了第一步,用于开发增强现实应用程序,但我在相机图像前集成 OpenGL 形状时遇到了麻烦。该程序应该在相机图像上的 XZ 平面中绘制一个正方形(假设 Z 轴指向上方),但我得到了两个正方形,它们比我不使用相机时要小。
这里有一些代码。
在主要活动中,我这样设置视图和传感器:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Create an Instance with this Activity
glSurface = new GLSurfaceView(this);
//Set our own Renderer
MyRenderer renderer = new Lesson02();
glSurface.setRenderer(renderer);
glSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT);
//Set the GLSurface as View to this Activity
setContentView(glSurface);
mCameraView = new CameraView(this);
addContentView(mCameraView, new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> listSensors = mSensorManager
.getSensorList(Sensor.TYPE_ACCELEROMETER);
if (listSensors.size() > 0) {
mSensorManager.registerListener(renderer,
listSensors.get(0), SensorManager.SENSOR_DELAY_UI);
}
listSensors = mSensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);
if (listSensors.size() > 0) {
mSensorManager.registerListener(renderer,
listSensors.get(0), SensorManager.SENSOR_DELAY_UI);
}
}
我的渲染器的 onDraw 方法做这样的事情:
public void onDrawFrame(GL10 gl) {
// Get rotation matrix from the sensor
SensorManager.getRotationMatrix(rotationMatrix, null,
mAccelerometerValues, mMagneticValues);
// As the documentation says, we are using the device as a compass in
// landscape mode
SensorManager.remapCoordinateSystem(rotationMatrix,
SensorManager.AXIS_Y,
SensorManager.AXIS_MINUS_X,
remappedRotationMatrix);
//Clear Screen And Depth Buffer
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// Load remapped matrix
gl.glMatrixMode(GL10.GL_MODELVIEW);
//Reset The Current Modelview Matrix
gl.glLoadIdentity();
gl.glLoadMatrixf(remappedRotationMatrix, 0);
// Draw square
gl.glTranslatef(-1.2f, 18.0f, 0.0f);
//gl.glTranslatef(0.0f, -1.2f, -6.0f); //Move down 1.2 Unit And Into The Screen 6.0
square.draw(gl); //Draw the square
}
最后,我初始化 onSurfaceCreated 方法中的所有内容,如下所示:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //Black Background
gl.glClearDepthf(1.0f); //Depth Buffer Setup
gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing
gl.glDepthFunc(GL10.GL_LEQUAL); //The Type Of Depth Testing To Do
/*
* By default, OpenGL enables features that improve quality but reduce
* performance. One might want to tweak that especially on software
* renderer.
*/
gl.glDisable(GL10.GL_DITHER);
/*
* Some one-time OpenGL initialization can be made here probably based
* on features of this particular context
*/
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
}
如果我评论该行
glSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT);
在活动中,它会很好地平滑地绘制正方形,并且只绘制一次。但是当我让它半透明甚至透明时,它会画出两个较小的正方形,当我旋转手机时,它们画得不好。
如果有人知道发生了什么,将不胜感激。
谢谢!!
【问题讨论】:
标签: android opengl-es augmented-reality translucency