lib/gamnit depth: intro VR for Android with head tracking
authorAlexis Laferrière <alexis.laf@xymus.net>
Tue, 19 Jan 2016 17:39:24 +0000 (12:39 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Wed, 20 Jan 2016 02:32:10 +0000 (21:32 -0500)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/gamnit/depth/cardboard.nit [new file with mode: 0644]
lib/gamnit/depth/vr.nit [new file with mode: 0644]

diff --git a/lib/gamnit/depth/cardboard.nit b/lib/gamnit/depth/cardboard.nit
new file mode 100644 (file)
index 0000000..ccecf15
--- /dev/null
@@ -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 (file)
index 0000000..1c3a845
--- /dev/null
@@ -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