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.Manifest;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
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.annotation.NonNull;
|
||||||
import android.support.v4.app.ActivityCompat;
|
import android.support.v4.app.ActivityCompat;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
|
@ -14,6 +19,9 @@ import android.util.Log;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
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.
|
* An example full-screen activity that shows and hides the system UI (i.e.
|
||||||
* status bar and navigation/system bar) with user interaction.
|
* status bar and navigation/system bar) with user interaction.
|
||||||
|
@ -154,6 +162,42 @@ public class PathfinderActivity extends AppCompatActivity {
|
||||||
return true;
|
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
|
@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 pushMouseDownEvent(int x, int y);
|
||||||
public static native void pushMouseDraggedEvent(int x, int y);
|
public static native void pushMouseDraggedEvent(int x, int y);
|
||||||
|
public static native void pushLookEvent(float pitch, float yaw);
|
||||||
|
|
||||||
static {
|
static {
|
||||||
System.loadLibrary("pathfinder_android_demo");
|
System.loadLibrary("pathfinder_android_demo");
|
||||||
|
|
|
@ -19,7 +19,6 @@ use pathfinder_geometry::basic::point::Point2DI32;
|
||||||
use pathfinder_gl::GLVersion;
|
use pathfinder_gl::GLVersion;
|
||||||
use pathfinder_gpu::resources::ResourceLoader;
|
use pathfinder_gpu::resources::ResourceLoader;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::ffi::CString;
|
|
||||||
use std::io::Error as IOError;
|
use std::io::Error as IOError;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::os::raw::c_void;
|
use std::os::raw::c_void;
|
||||||
|
@ -63,8 +62,8 @@ pub unsafe extern "system" fn
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "system" fn
|
pub unsafe extern "system" fn
|
||||||
Java_graphics_pathfinder_pathfinderdemo_PathfinderDemoRenderer_pushMouseDownEvent(
|
Java_graphics_pathfinder_pathfinderdemo_PathfinderDemoRenderer_pushMouseDownEvent(
|
||||||
env: JNIEnv,
|
_: JNIEnv,
|
||||||
class: JClass,
|
_: JClass,
|
||||||
x: i32,
|
x: i32,
|
||||||
y: i32) {
|
y: i32) {
|
||||||
EVENT_QUEUE.lock().unwrap().push(Event::MouseDown(Point2DI32::new(x, y)))
|
EVENT_QUEUE.lock().unwrap().push(Event::MouseDown(Point2DI32::new(x, y)))
|
||||||
|
@ -73,13 +72,23 @@ pub unsafe extern "system" fn
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "system" fn
|
pub unsafe extern "system" fn
|
||||||
Java_graphics_pathfinder_pathfinderdemo_PathfinderDemoRenderer_pushMouseDraggedEvent(
|
Java_graphics_pathfinder_pathfinderdemo_PathfinderDemoRenderer_pushMouseDraggedEvent(
|
||||||
env: JNIEnv,
|
_: JNIEnv,
|
||||||
class: JClass,
|
_: JClass,
|
||||||
x: i32,
|
x: i32,
|
||||||
y: i32) {
|
y: i32) {
|
||||||
EVENT_QUEUE.lock().unwrap().push(Event::MouseDragged(Point2DI32::new(x, y)))
|
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;
|
struct WindowImpl;
|
||||||
|
|
||||||
impl Window for WindowImpl {
|
impl Window for WindowImpl {
|
||||||
|
|
|
@ -275,6 +275,12 @@ impl<W> DemoApp<W> where W: Window {
|
||||||
*transform = transform.post_translate(position);
|
*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')) => {
|
Event::KeyDown(Keycode::Alphanumeric(b'w')) => {
|
||||||
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
|
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
|
||||||
let scale_factor = scale_factor_for_view_box(self.scene_view_box);
|
let scale_factor = scale_factor_for_view_box(self.scene_view_box);
|
||||||
|
|
|
@ -39,6 +39,7 @@ pub enum Event {
|
||||||
MouseMoved(Point2DI32),
|
MouseMoved(Point2DI32),
|
||||||
MouseDragged(Point2DI32),
|
MouseDragged(Point2DI32),
|
||||||
Zoom(f32),
|
Zoom(f32),
|
||||||
|
Look { pitch: f32, yaw: f32 },
|
||||||
User { message_type: u32, message_data: u32 },
|
User { message_type: u32, message_data: u32 },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue