用于OpenGL的Android传感器
问题描述:
我想让android传感器与opengl一起使用,将opengl的相机旋转到手机指向的任何位置。详细说明:如果玩家在看东方,我想在游戏中将opengl的相机点指向东方;如果玩家指向天空,我想将opengl的相机指向天空等等。用于OpenGL的Android传感器
我试过使用getRotationMatrix
并在opengl上加载矩阵,但它只能在上下方向上工作,如果将单元转到两边,则没有区别。以下是我迄今所做的(应用程序是在横向模式下):
public void onSensorChanged(SensorEvent evt) {
int type=evt.sensor.getType();
float alpha = 0.8f;
//Smoothing the sensor data a bit
if (type == Sensor.TYPE_MAGNETIC_FIELD) {
geomag[0]=geomag[0]*alpha+evt.values[0]*(1-alpha);
geomag[1]=geomag[1]*alpha+evt.values[1]*(1-alpha);
geomag[2]=geomag[2]*alpha+evt.values[2]*(1-alpha);
} else if (type == Sensor.TYPE_ACCELEROMETER) {
gravity[0]= gravity[0]*alpha+evt.values[0]*(1-alpha);
gravity[1]= gravity[1]*alpha+evt.values[1]*(1-alpha);
gravity[2]= gravity[2]*alpha+evt.values[2]*(1-alpha);
}
if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
rotationMatrix = new float[16];
SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomag);
SensorManager.remapCoordinateSystem(
rotationMatrix,
SensorManager.AXIS_Y,
SensorManager.AXIS_MINUS_X,
rotationMatrix);
if (AOGLRenderer.rotationmatrix==null) AOGLRenderer.rotationmatrix = new float[16];
AOGLRenderer.rotationmatrix = rotationMatrix;
}
}
,并在OpenGL的代码:
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | // OpenGL docs.
GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
if (rotationmatrix!=null) gl.glLoadMatrixf(rotationmatrix, 0);
gl.glPushMatrix();
gl.glTranslatef(0, 0, -70);
g.draw(gl);
gl.glPopMatrix();
alpha+=2f;
gl.glTranslatef(0, -15, 0);
c.draw(gl);
我想有人谁真正做到了可以共享他们的代码!我真的很感激它!谢谢你们!
答
您正在为倾角矩阵提供null
- 这是不正确的。
SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomag);
有很多关于如何使用SensorManager的getRotationMatrix(...)
的示例。
float[] R = new float[16];
float[] I = new float[16];
if (SensorManager.getRotationMatrix(R, I, accelerometerValues, geomagneticValues)) {
float[] anglesInRadians = new float[3];
SensorManager.getOrientation(R, anglesInRadians);
...
}
而且“旋转OpenGL的摄像头无论手机指向”是比较模糊的。例如,如果您的意思是某种增强现实方法,那么您应该将AXIS_X
映射到AXIS_Z
。请注意,重新映射可能甚至不是必需的,例如,当你已经将你的活动修复到横向模式时。更多详情here。
涉及传感器数据和OpenGL ES一些示例代码:
答
这里是我做同样的事情的方式(我的应用程序也是在横向)。首先我得到的方向值(类比到你的方式):
final float pi = (float) Math.PI;
final float rad2deg = 180/pi;
public static float x; //pitch
public static float y; //roll
public static float z; //azimuth
float[] gravity = new float[3];
float[] geomag = new float[3];
float[] inOrientMatrix = new float[16];
float[] outOrientMatrix= new float[16];
float orientation[] = new float[3];
public static GLSurfaceView glView;
// (...)
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER: gravity = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD: geomag = event.values.clone();
break;
}
if (gravity != null && geomag != null){
if (SensorManager.getRotationMatrix(inOrientMatrix, null, gravity, geomag)){
SensorManager.remapCoordinateSystem(inOrientMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, outOrientMatrix);
SensorManager.getOrientation(outOrientMatrix, orientation);
x = orientation[1]*rad2deg; //pitch
y = orientation[0]*rad2deg; //azimuth
z = orientation[2]*rad2deg; //roll
glView.requestRender();
}
然后在我的呈现,在onDrawFrame(GL10 GL)我做的:
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);
gl.glRotatef(MainActivity.x, 1.0f, 0.0f, 0.0f);
gl.glRotatef(MainActivity.y, 0.0f, 1.0f, 0.0f);
gl.glRotatef(MainActivity.z, 0.0f, 0.0f, 1.0f);
//in case you have transformation, eg. the position of the object, you can do them here
//gl.Translatef(0.0f, 0.0f, -DISTANCE NORTH);
//gl.Translatef(0.0f, DISTANCE EAST, 0.0f);
gl.glPushMatrix();
//object draw
换句话说,我旋转我周围的整个世界。更好的方法是使用glLookAt改变相机的方向,眼睛位于(0,0,0)和(0,1,0)是向上矢量,但我根本无法得到我的center_view x ,y,z值正确。
希望这有助于...
感谢您的回答!但没有真正解决。我的意思是完成此视频中显示的相同内容:http://www.youtube.com/watch?v = wfRjZrnPBXY – rdnobrega 2012-01-04 19:52:23