用于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一些示例代码:

+0

感谢您的回答!但没有真正解决。我的意思是完成此视频中显示的相同内容:http://www.youtube.com/watch?v = wfRjZrnPBXY – rdnobrega 2012-01-04 19:52:23

这里是我做同样的事情的方式(我的应用程序也是在横向)。首先我得到的方向值(类比到你的方式):

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值正确。

希望这有助于...