Tôi muốn cảm biến Android hoạt động với opengl để xoay camera của opengl đến bất kỳ nơi nào điện thoại hướng tới.
Chi tiết: Nếu người chơi đang nhìn về phía đông, tôi muốn camera opengl cũng hướng về phía đông trong trò chơi; nếu người chơi chỉ lên bầu trời, tôi muốn camera opengl hướng về bầu trời, v.v.
Tôi đã thử sử dụng getRotationMatrix
và nạp ma trận trên opengl nhưng nó chỉ hoạt động theo hướng lên xuống, nếu mình lật các ô sang 2 bên thì cũng không có gì khác biệt. Đây là những gì tôi đã làm cho đến nay (ứng dụng ở chế độ ngang):
khoảng trống công khai trênSensorChanged(SensorEvent evt) {
int type=evt.sensor.getType();
phao alpha = 0,8f;
// Làm mịn dữ liệu cảm biến một chút
if (loại == Cảm biến.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);
} khác nếu (loại == Cảm biến.TYPE_ACCELEROMETER) {
trọng lực[0]= trọng lực[0]*alpha+evt.values[0]*(1-alpha);
trọng lực[1]= trọng lực[1]*alpha+evt.values[1]*(1-alpha);
trọng lực[2]= trọng lực[2]*alpha+evt.values[2]*(1-alpha);
}
if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
spinningMatrix = float mới [16];
SensorManager.getRotationMatrix(rotationMatrix, null, Gravity, geomag);
SensorManager.remapCoordineSystem(
xoayMatrix,
Trình quản lý cảm biến.AXIS_Y,
Trình quản lý cảm biến.AXIS_MINUS_X,
vòng quayMatrix);
if (AOGLRenderer.rotationmatrix==null) AOGLRenderer.rotationmatrix = new float[16];
AOGLRenderer.rotationmatrix = spinningMatrix;
}
}
Trong mã opengl:
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | // Tài liệu OpenGL.
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);
Tôi hy vọng ai đó đã thực sự làm điều này có thể chia sẻ mã của họ. Tôi thực sự sẽ đánh giá cao nó!
Đối với ma trận nghiêng bạn cung cấp null
- Điều này không đúng.
SensorManager.getRotationMatrix(rotationMatrix, null, Gravity, geomag);
Có rất nhiều điều về cách sử dụng SensorManager getRotationMatrix(...)
ví dụ.
float[] R = float mới[16];
float[] I = float mới[16];
if (SensorManager.getRotationMatrix(R, I, accelerometerValues, geomagneticValues)) {
float[] AngleInRadians = new float[3];
SensorManager.getOrientation(R, AngleInRadians);
...
}
Mà còn,"Xoay camera opengl tới bất cứ nơi nào điện thoại được trỏ” cũng khá mơ hồ, chẳng hạn nếu bạn đang đề cập đến một phương pháp thực tế tăng cường nào đó thì bạn nên làm như vậy. AXIS_X
ánh xạ tới AXIS_Z
. Lưu ý rằng việc ánh xạ lại thậm chí có thể không cần thiết, chẳng hạn như khi bạn đã ghim hoạt động sang chế độ ngang. Thêm chi tiết đây .
Một số mã mẫu liên quan đến dữ liệu cảm biến và OpenGL ES:
Tôi là một lập trình viên xuất sắc, rất giỏi!