From: Alexis Laferrière Date: Tue, 19 Jan 2016 17:39:24 +0000 (-0500) Subject: lib/gamnit depth: intro VR for Android with head tracking X-Git-Tag: v0.8~12^2~1 X-Git-Url: http://nitlanguage.org lib/gamnit depth: intro VR for Android with head tracking Signed-off-by: Alexis Laferrière --- diff --git a/lib/gamnit/depth/cardboard.nit b/lib/gamnit/depth/cardboard.nit new file mode 100644 index 0000000..ccecf15 --- /dev/null +++ b/lib/gamnit/depth/cardboard.nit @@ -0,0 +1,108 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Update the orientation of `world_camera` at each frame using the head position given by `android::cardboard` +# +# This module is Android specific. +module cardboard + +import ::android::cardboard + +import depth +intrude import cameras + +redef class EulerCamera + # Do not use `yaw` and `pitch`, the value will instead originate from the Cardboard API + redef var rotation_matrix = new Matrix.identity(4) + + # Get the angle value from the `rotation_matrix` + redef fun pitch + do + var a = rotation_matrix[0, 1] + var b = rotation_matrix[1, 1] + return -atan2(a, b) + end + + # Get the angle value from the `rotation_matrix` + redef fun yaw + do + var a = rotation_matrix[2, 0] + var b = rotation_matrix[2, 2] + return -atan2(a, b) + end +end + +redef class App + + # Cardboard's head tacker instance + private var head_tracker: nullable NativeHeadTracker = null + + # Rotation matrix read from `head_tracker`, reusing the same structure as a buffer + private var java_rotation_matrix = new JavaFloatArray(16) is lazy + + # Initialize and set `head_tracker` + fun initialize_head_tracker + do + # Initialize the Cardboard head orientation tracker service + var head_tracker = new NativeHeadTracker(app.native_activity) + head_tracker.neck_model_enabled = true + head_tracker.start_tracking + self.head_tracker = head_tracker + + # Set a wide field of view + world_camera.field_of_view_y = 1.0 + end + + # Read the rotation matrix from Cardboard and update `world_camera` + private fun update_from_head_tracker + do + var head_tracker = head_tracker + if head_tracker == null then return + + head_tracker.last_head_view(java_rotation_matrix, 0) + + # Copy values from the Java array to our matrix + for y in [0..4[ do + for x in [0..4[ do + world_camera.rotation_matrix[y, x] = java_rotation_matrix[y*4+x] + end + end + end + + redef fun on_create + do + super + initialize_head_tracker + end + + redef fun update(dt) + do + super + update_from_head_tracker + end + + redef fun pause + do + super + var tracker = head_tracker + if tracker != null then tracker.stop_tracking + end + + redef fun resume + do + super + var tracker = head_tracker + if tracker != null then tracker.start_tracking + end +end diff --git a/lib/gamnit/depth/vr.nit b/lib/gamnit/depth/vr.nit new file mode 100644 index 0000000..1c3a845 --- /dev/null +++ b/lib/gamnit/depth/vr.nit @@ -0,0 +1,19 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# VR support for gamnit depth, for Android only +module vr + +import cardboard +import stereoscopic_view