Browse Source

Converted sensor acceleration units to m/s^2 on iOS and UWP

This is beacuse on Android these values are already in m/s^2 while on
iOS and UWP they are in g. This just makes the behaviour consistent on
all platforms.
Marcus Brummer 4 years ago
parent
commit
fda2743fef
3 changed files with 20 additions and 8 deletions
  1. 4 4
      doc/classes/Input.xml
  2. 11 1
      platform/iphone/godot_view.mm
  3. 5 3
      platform/uwp/os_uwp.cpp

+ 4 - 4
doc/classes/Input.xml

@@ -49,9 +49,9 @@
 			<return type="Vector3">
 			</return>
 			<description>
-				Returns the acceleration of the device's accelerometer sensor, if the device has one. Otherwise, the method returns [constant Vector3.ZERO].
+				Returns the acceleration in m/s² of the device's accelerometer sensor, if the device has one. Otherwise, the method returns [constant Vector3.ZERO].
 				Note this method returns an empty [Vector3] when running from the editor even when your device has an accelerometer. You must export your project to a supported device to read values from the accelerometer.
-				[b]Note:[/b] This method only works on iOS, Android, and UWP. On other platforms, it always returns [constant Vector3.ZERO]. On Android the unit of measurement for each axis is m/s² while on iOS and UWP it's a multiple of the Earth's gravitational acceleration [code]g[/code] (~9.81 m/s²).
+				[b]Note:[/b] This method only works on iOS, Android, and UWP. On other platforms, it always returns [constant Vector3.ZERO].
 			</description>
 		</method>
 		<method name="get_action_raw_strength" qualifiers="const">
@@ -106,8 +106,8 @@
 			<return type="Vector3">
 			</return>
 			<description>
-				Returns the gravity of the device's accelerometer sensor, if the device has one. Otherwise, the method returns [constant Vector3.ZERO].
-				[b]Note:[/b] This method only works on Android and iOS. On other platforms, it always returns [constant Vector3.ZERO]. On Android the unit of measurement for each axis is m/s² while on iOS it's a multiple of the Earth's gravitational acceleration [code]g[/code] (~9.81 m/s²).
+				Returns the gravity in m/s² of the device's accelerometer sensor, if the device has one. Otherwise, the method returns [constant Vector3.ZERO].
+				[b]Note:[/b] This method only works on Android and iOS. On other platforms, it always returns [constant Vector3.ZERO].
 			</description>
 		</method>
 		<method name="get_gyroscope" qualifiers="const">

+ 11 - 1
platform/iphone/godot_view.mm

@@ -39,6 +39,7 @@
 #import <CoreMotion/CoreMotion.h>
 
 static const int max_touches = 8;
+static const float earth_gravity = 9.80665;
 
 @interface GodotView () {
 	UITouch *godot_touches[max_touches];
@@ -402,10 +403,19 @@ static const int max_touches = 8;
 	// https://developer.apple.com/reference/coremotion/cmmotionmanager?language=objc
 
 	// Apple splits our accelerometer date into a gravity and user movement
-	// component. We add them back together
+	// component. We add them back together.
 	CMAcceleration gravity = self.motionManager.deviceMotion.gravity;
 	CMAcceleration acceleration = self.motionManager.deviceMotion.userAcceleration;
 
+	// To be consistent with Android we convert the unit of measurement from g (Earth's gravity)
+	// to m/s^2.
+	gravity.x *= earth_gravity;
+	gravity.y *= earth_gravity;
+	gravity.z *= earth_gravity;
+	acceleration.x *= earth_gravity;
+	acceleration.y *= earth_gravity;
+	acceleration.z *= earth_gravity;
+
 	///@TODO We don't seem to be getting data here, is my device broken or
 	/// is this code incorrect?
 	CMMagneticField magnetic = self.motionManager.deviceMotion.magneticField.field;

+ 5 - 3
platform/uwp/os_uwp.cpp

@@ -62,6 +62,8 @@ using namespace Windows::Devices::Sensors;
 using namespace Windows::ApplicationModel::DataTransfer;
 using namespace concurrency;
 
+static const float earth_gravity = 9.80665;
+
 int OS_UWP::get_video_driver_count() const {
 	return 2;
 }
@@ -372,9 +374,9 @@ void OS_UWP::ManagedType::on_accelerometer_reading_changed(Accelerometer ^ sende
 	AccelerometerReading ^ reading = args->Reading;
 
 	os->input->set_accelerometer(Vector3(
-			reading->AccelerationX,
-			reading->AccelerationY,
-			reading->AccelerationZ));
+			reading->AccelerationX * earth_gravity,
+			reading->AccelerationY * earth_gravity,
+			reading->AccelerationZ * earth_gravity));
 }
 
 void OS_UWP::ManagedType::on_magnetometer_reading_changed(Magnetometer ^ sender, MagnetometerReadingChangedEventArgs ^ args) {