Use the gyroscope to look around on Android
This commit is contained in:
parent
bb32777101
commit
f02e75edaf
|
@ -2,7 +2,12 @@ package graphics.pathfinder.pathfinderdemo;
|
|||
|
||||
import android.Manifest;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
|
@ -14,6 +19,9 @@ import android.util.Log;
|
|||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* An example full-screen activity that shows and hides the system UI (i.e.
|
||||
* status bar and navigation/system bar) with user interaction.
|
||||
|
@ -154,6 +162,42 @@ public class PathfinderActivity extends AppCompatActivity {
|
|||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
final SensorManager sensorManager = (SensorManager)
|
||||
getSystemService(Context.SENSOR_SERVICE);
|
||||
final Sensor rotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
|
||||
sensorManager.registerListener(new SensorEventListener() {
|
||||
private boolean mInitialized;
|
||||
private float mPitch;
|
||||
private float mYaw;
|
||||
|
||||
@Override
|
||||
public void onSensorChanged(SensorEvent event) {
|
||||
// https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Quaternion_to_Euler_Angles_Conversion
|
||||
float[] q = event.values;
|
||||
float pitch = (float)Math.asin(2.0 * (q[0] * q[2] - q[3] * q[1]));
|
||||
float yaw = (float)Math.atan2(2.0 * (q[0] * q[3] + q[1] * q[2]),
|
||||
1.0 - 2.0 * (q[2] * q[2] + q[3] * q[3]));
|
||||
|
||||
float deltaPitch = pitch - mPitch;
|
||||
float deltaYaw = yaw - mYaw;
|
||||
|
||||
mPitch = pitch;
|
||||
mYaw = yaw;
|
||||
|
||||
if (!mInitialized) {
|
||||
mInitialized = true;
|
||||
return;
|
||||
}
|
||||
|
||||
PathfinderDemoRenderer.pushLookEvent(-deltaPitch, deltaYaw);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
||||
|
||||
}
|
||||
}, rotationSensor, 5000);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -14,6 +14,7 @@ public class PathfinderDemoRenderer extends Object implements GLSurfaceView.Rend
|
|||
|
||||
public static native void pushMouseDownEvent(int x, int y);
|
||||
public static native void pushMouseDraggedEvent(int x, int y);
|
||||
public static native void pushLookEvent(float pitch, float yaw);
|
||||
|
||||
static {
|
||||
System.loadLibrary("pathfinder_android_demo");
|
||||
|
|
|
@ -19,7 +19,6 @@ use pathfinder_geometry::basic::point::Point2DI32;
|
|||
use pathfinder_gl::GLVersion;
|
||||
use pathfinder_gpu::resources::ResourceLoader;
|
||||
use std::cell::RefCell;
|
||||
use std::ffi::CString;
|
||||
use std::io::Error as IOError;
|
||||
use std::mem;
|
||||
use std::os::raw::c_void;
|
||||
|
@ -63,8 +62,8 @@ pub unsafe extern "system" fn
|
|||
#[no_mangle]
|
||||
pub unsafe extern "system" fn
|
||||
Java_graphics_pathfinder_pathfinderdemo_PathfinderDemoRenderer_pushMouseDownEvent(
|
||||
env: JNIEnv,
|
||||
class: JClass,
|
||||
_: JNIEnv,
|
||||
_: JClass,
|
||||
x: i32,
|
||||
y: i32) {
|
||||
EVENT_QUEUE.lock().unwrap().push(Event::MouseDown(Point2DI32::new(x, y)))
|
||||
|
@ -73,13 +72,23 @@ pub unsafe extern "system" fn
|
|||
#[no_mangle]
|
||||
pub unsafe extern "system" fn
|
||||
Java_graphics_pathfinder_pathfinderdemo_PathfinderDemoRenderer_pushMouseDraggedEvent(
|
||||
env: JNIEnv,
|
||||
class: JClass,
|
||||
_: JNIEnv,
|
||||
_: JClass,
|
||||
x: i32,
|
||||
y: i32) {
|
||||
EVENT_QUEUE.lock().unwrap().push(Event::MouseDragged(Point2DI32::new(x, y)))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "system" fn
|
||||
Java_graphics_pathfinder_pathfinderdemo_PathfinderDemoRenderer_pushLookEvent(
|
||||
_: JNIEnv,
|
||||
_: JClass,
|
||||
pitch: f32,
|
||||
yaw: f32) {
|
||||
EVENT_QUEUE.lock().unwrap().push(Event::Look { pitch, yaw })
|
||||
}
|
||||
|
||||
struct WindowImpl;
|
||||
|
||||
impl Window for WindowImpl {
|
||||
|
|
|
@ -275,6 +275,12 @@ impl<W> DemoApp<W> where W: Window {
|
|||
*transform = transform.post_translate(position);
|
||||
}
|
||||
}
|
||||
Event::Look { pitch, yaw } => {
|
||||
if let Camera::ThreeD { ref mut transform, .. } = self.camera {
|
||||
transform.pitch += pitch;
|
||||
transform.yaw += yaw;
|
||||
}
|
||||
}
|
||||
Event::KeyDown(Keycode::Alphanumeric(b'w')) => {
|
||||
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
|
||||
let scale_factor = scale_factor_for_view_box(self.scene_view_box);
|
||||
|
|
|
@ -39,6 +39,7 @@ pub enum Event {
|
|||
MouseMoved(Point2DI32),
|
||||
MouseDragged(Point2DI32),
|
||||
Zoom(f32),
|
||||
Look { pitch: f32, yaw: f32 },
|
||||
User { message_type: u32, message_data: u32 },
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue