Update Mobile Sensors demo for Godot 4.1 (#992)

This commit is contained in:
Alex
2023-10-30 18:44:11 +01:00
committed by GitHub
parent 757cc4261c
commit 232eb35acf
8 changed files with 213 additions and 88 deletions

View File

@@ -5,10 +5,10 @@ These sensors are typically found on mobile devices, so don't expect this to wor
Language: GDScript
Renderer: GLES 2
Renderer: Mobile
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/143
## Screenshots
![Screenshot](screenshots/sensors.png)
![Screenshot](screenshots/sensors.webp)

View File

@@ -1,37 +1,36 @@
[remap]
importer="texture"
type="StreamTexture2D"
path.s3tc="res://.godot/imported/cube_6.png-0b954e2c88c21596044fe6448711988e.s3tc.stex"
path.etc="res://.godot/imported/cube_6.png-0b954e2c88c21596044fe6448711988e.etc.stex"
type="CompressedTexture2D"
uid="uid://yba5kdfjgn65"
path.s3tc="res://.godot/imported/cube_6.png-0b954e2c88c21596044fe6448711988e.s3tc.ctex"
path.etc2="res://.godot/imported/cube_6.png-0b954e2c88c21596044fe6448711988e.etc2.ctex"
metadata={
"imported_formats": ["s3tc", "etc"],
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://cube_6.png"
dest_files=["res://.godot/imported/cube_6.png-0b954e2c88c21596044fe6448711988e.s3tc.stex", "res://.godot/imported/cube_6.png-0b954e2c88c21596044fe6448711988e.etc.stex"]
dest_files=["res://.godot/imported/cube_6.png-0b954e2c88c21596044fe6448711988e.s3tc.ctex", "res://.godot/imported/cube_6.png-0b954e2c88c21596044fe6448711988e.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/hdr_compression=1
compress/normal_map=0
flags/repeat=true
flags/filter=true
flags/mipmaps=true
flags/anisotropic=false
flags/srgb=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@@ -1,7 +1,7 @@
[gd_resource type="Environment" load_steps=2 format=2]
[gd_resource type="Environment" load_steps=2 format=3 uid="uid://f45bpansont3"]
[sub_resource type="Sky" id=1]
[sub_resource type="Sky" id="1"]
[resource]
background_mode = 2
background_sky = SubResource( 1 )
sky = SubResource("1")

View File

@@ -1,5 +1,6 @@
extends Node
# Below are a number of helper functions that show how you can use the raw sensor data to determine the orientation
# of your phone/device. The cheapest phones only have an accelerometer only the most expensive phones have all three.
# Note that none of this logic filters data. Filters introduce lag but also provide stability. There are plenty
@@ -30,6 +31,7 @@ func get_basis_for_arrow(p_vector):
return rotate
# This function combines the magnetometer reading with the gravity vector to get a vector that points due north
func calc_north(p_grav, p_mag):
# Always use normalized vectors!
@@ -43,6 +45,7 @@ func calc_north(p_grav, p_mag):
# Cross again to get our horizon aligned north
return east.cross(p_grav).normalized()
# This function creates an orientation matrix using the magnetometer and gravity vector as inputs.
func orientate_by_mag_and_grav(p_mag, p_grav):
var rotate = Basis()
@@ -61,6 +64,7 @@ func orientate_by_mag_and_grav(p_mag, p_grav):
return rotate
# This function takes our gyro input and update an orientation matrix accordingly
# The gyro is special as this vector does not contain a direction but rather a
# rotational velocity. This is why we multiply our values with delta.
@@ -73,6 +77,7 @@ func rotate_by_gyro(p_gyro, p_basis, p_delta):
return rotate * p_basis
# This function corrects the drift in our matrix by our gravity vector
func drift_correction(p_basis, p_grav):
# as always, make sure our vector is normalized but also invert as our gravity points down
@@ -90,6 +95,7 @@ func drift_correction(p_basis, p_grav):
return p_basis
func _process(delta):
# Get our data
var acc = Input.get_accelerometer()
@@ -98,9 +104,23 @@ func _process(delta):
var gyro = Input.get_gyroscope()
# Show our base values
get_node(^"Control/Accelerometer").text = "Accelerometer: " + str(acc) + ", gravity: " + str(grav)
get_node(^"Control/Magnetometer").text = "Magnetometer: " + str(mag)
get_node(^"Control/Gyroscope").text = "Gyroscope: " + str(gyro)
var format = "%.05f"
%AccX.text = format % acc.x
%AccY.text = format % acc.y
%AccZ.text = format % acc.z
%GravX.text = format % grav.x
%GravY.text = format % grav.y
%GravZ.text = format % grav.z
%MagX.text = format % mag.x
%MagY.text = format % mag.y
%MagZ.text = format % mag.z
%GyroX.text = format % gyro.x
%GyroY.text = format % gyro.y
%GyroZ.text = format % gyro.z
# Check if we have all needed data
if grav.length() < 0.1:
@@ -116,23 +136,23 @@ func _process(delta):
mag = Vector3(1.0, 0.0, 0.0)
# Update our arrow showing gravity
get_node(^"Arrows/AccelerometerArrow").transform.basis = get_basis_for_arrow(grav)
$Arrows/AccelerometerArrow.transform.basis = get_basis_for_arrow(grav)
# Update our arrow showing our magnetometer
# Note that in absence of other strong magnetic forces this will point to magnetic north, which is not horizontal thanks to the earth being, uhm, round
get_node(^"Arrows/MagnetoArrow").transform.basis = get_basis_for_arrow(mag)
$Arrows/MagnetoArrow.transform.basis = get_basis_for_arrow(mag)
# Calculate our north vector and show that
var north = calc_north(grav,mag)
get_node(^"Arrows/NorthArrow").transform.basis = get_basis_for_arrow(north)
var north = calc_north(grav, mag)
$Arrows/NorthArrow.transform.basis = get_basis_for_arrow(north)
# Combine our magnetometer and gravity vector to position our box. This will be fairly accurate
# but our magnetometer can be easily influenced by magnets. Cheaper phones often don't have gyros
# so it is a good backup.
var mag_and_grav = get_node(^"Boxes/MagAndGrav")
var mag_and_grav = $Boxes/MagAndGrav
mag_and_grav.transform.basis = orientate_by_mag_and_grav(mag, grav).orthonormalized()
# Using our gyro and do a drift correction using our gravity vector gives the best result
var gyro_and_grav = get_node(^"Boxes/GyroAndGrav")
var gyro_and_grav = $Boxes/GyroAndGrav
var new_basis = rotate_by_gyro(gyro, gyro_and_grav.transform.basis, delta).orthonormalized()
gyro_and_grav.transform.basis = drift_correction(new_basis, grav)

View File

@@ -1,77 +1,180 @@
[gd_scene load_steps=11 format=2]
[gd_scene load_steps=11 format=3 uid="uid://cfhql05dj6udh"]
[ext_resource path="res://main.gd" type="Script" id=1]
[ext_resource path="res://cube_6.png" type="Texture2D" id=2]
[ext_resource type="Script" path="res://main.gd" id="1"]
[ext_resource type="Texture2D" uid="uid://yba5kdfjgn65" path="res://cube_6.png" id="2"]
[sub_resource type="Environment" id=1]
[sub_resource type="Environment" id="1"]
background_mode = 1
ambient_light_color = Color(0.648438, 0.64578, 0.64578, 1)
[sub_resource type="CylinderMesh" id=2]
[sub_resource type="CylinderMesh" id="2"]
top_radius = 0.2
bottom_radius = 0.1
height = 4.0
radial_segments = 16
[sub_resource type="StandardMaterial3D" id=3]
params_diffuse_mode = 1
[sub_resource type="StandardMaterial3D" id="3"]
diffuse_mode = 1
albedo_color = Color(0.356557, 1, 0.366611, 1)
roughness = 0.0
[sub_resource type="CylinderMesh" id=4]
[sub_resource type="CylinderMesh" id="4"]
top_radius = 0.1
radial_segments = 16
[sub_resource type="StandardMaterial3D" id=5]
params_diffuse_mode = 1
[sub_resource type="StandardMaterial3D" id="5"]
diffuse_mode = 1
albedo_color = Color(0.0266393, 0.292793, 1, 1)
roughness = 0.0
[sub_resource type="StandardMaterial3D" id=6]
params_diffuse_mode = 1
[sub_resource type="StandardMaterial3D" id="6"]
diffuse_mode = 1
albedo_color = Color(0.957031, 0.801627, 0.0921731, 1)
roughness = 0.0
[sub_resource type="BoxMesh" id=7]
[sub_resource type="BoxMesh" id="7"]
size = Vector3(4, 4, 4)
[sub_resource type="StandardMaterial3D" id=8]
params_diffuse_mode = 1
albedo_texture = ExtResource( 2 )
[sub_resource type="StandardMaterial3D" id="8"]
diffuse_mode = 1
albedo_texture = ExtResource("2")
roughness = 0.0
[node name="Main" type="Node"]
script = ExtResource( 1 )
script = ExtResource("1")
[node name="Control" type="Control" parent="."]
layout_mode = 3
anchors_preset = 0
offset_right = 1025.0
offset_bottom = 602.0
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Accelerometer" type="Label" parent="Control"]
offset_right = 340.0
offset_bottom = 14.0
rect_scale = Vector2(2, 2)
[node name="GridContainer" type="GridContainer" parent="Control"]
offset_right = 40.0
offset_bottom = 40.0
columns = 4
[node name="LabelEmpty" type="Label" parent="Control/GridContainer"]
layout_mode = 2
[node name="LabelX" type="Label" parent="Control/GridContainer"]
layout_mode = 2
theme_override_colors/font_color = Color(0.666667, 0.666667, 0.666667, 1)
text = "X"
horizontal_alignment = 1
[node name="LabelY" type="Label" parent="Control/GridContainer"]
layout_mode = 2
theme_override_colors/font_color = Color(0.666667, 0.666667, 0.666667, 1)
text = "Y"
horizontal_alignment = 1
[node name="LabelZ" type="Label" parent="Control/GridContainer"]
layout_mode = 2
theme_override_colors/font_color = Color(0.666667, 0.666667, 0.666667, 1)
text = "Z"
horizontal_alignment = 1
[node name="Accelerometer" type="Label" parent="Control/GridContainer"]
layout_mode = 2
theme_override_colors/font_color = Color(0.666667, 0.666667, 0.666667, 1)
text = "Accelerometer"
[node name="Magnetometer" type="Label" parent="Control"]
offset_top = 30.0
offset_right = 340.0
offset_bottom = 44.0
rect_scale = Vector2(2, 2)
[node name="AccX" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(90, 2.08165e-12)
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="AccY" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(90, 2.08165e-12)
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="AccZ" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(90, 2.08165e-12)
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="Gravity" type="Label" parent="Control/GridContainer"]
layout_mode = 2
theme_override_colors/font_color = Color(0.666667, 0.666667, 0.666667, 1)
text = "Gravity"
[node name="GravX" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="GravY" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="GravZ" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="Magnetometer" type="Label" parent="Control/GridContainer"]
layout_mode = 2
theme_override_colors/font_color = Color(0.666667, 0.666667, 0.666667, 1)
text = "Magnetometer"
[node name="Gyroscope" type="Label" parent="Control"]
offset_top = 60.0
offset_right = 340.0
offset_bottom = 74.0
rect_scale = Vector2(2, 2)
[node name="MagX" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="MagY" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="MagZ" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="Gyroscope" type="Label" parent="Control/GridContainer"]
layout_mode = 2
theme_override_colors/font_color = Color(0.666667, 0.666667, 0.666667, 1)
text = "Gyroscope"
[node name="GyroX" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="GyroY" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="GyroZ" type="Label" parent="Control/GridContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
horizontal_alignment = 1
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.285209, 0, 11.9833)
environment = SubResource( 1 )
environment = SubResource("1")
fov = 74.0
near = 0.1
@@ -82,51 +185,51 @@ transform = Transform3D(1, 0, 0, 0, -1, 8.74228e-08, 0, -8.74228e-08, -1, 0, 0,
[node name="Bottom" type="MeshInstance3D" parent="Arrows/AccelerometerArrow"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
mesh = SubResource( 2 )
surface_material_override/0 = SubResource( 3 )
mesh = SubResource("2")
surface_material_override/0 = SubResource("3")
[node name="Top" type="MeshInstance3D" parent="Arrows/AccelerometerArrow"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0)
mesh = SubResource( 4 )
surface_material_override/0 = SubResource( 3 )
mesh = SubResource("4")
surface_material_override/0 = SubResource("3")
[node name="MagnetoArrow" type="Node3D" parent="Arrows"]
transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0, 0, 0)
[node name="Bottom" type="MeshInstance3D" parent="Arrows/MagnetoArrow"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
mesh = SubResource( 2 )
surface_material_override/0 = SubResource( 5 )
mesh = SubResource("2")
surface_material_override/0 = SubResource("5")
[node name="Top" type="MeshInstance3D" parent="Arrows/MagnetoArrow"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0)
mesh = SubResource( 4 )
surface_material_override/0 = SubResource( 5 )
mesh = SubResource("4")
surface_material_override/0 = SubResource("5")
[node name="NorthArrow" type="Node3D" parent="Arrows"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
[node name="Bottom" type="MeshInstance3D" parent="Arrows/NorthArrow"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
mesh = SubResource( 2 )
surface_material_override/0 = SubResource( 6 )
mesh = SubResource("2")
surface_material_override/0 = SubResource("6")
[node name="Top" type="MeshInstance3D" parent="Arrows/NorthArrow"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0)
mesh = SubResource( 4 )
surface_material_override/0 = SubResource( 6 )
mesh = SubResource("4")
surface_material_override/0 = SubResource("6")
[node name="Boxes" type="Node3D" parent="."]
[node name="MagAndGrav" type="MeshInstance3D" parent="Boxes"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7, -4, 0)
mesh = SubResource( 7 )
surface_material_override/0 = SubResource( 8 )
mesh = SubResource("7")
surface_material_override/0 = SubResource("8")
[node name="GyroAndGrav" type="MeshInstance3D" parent="Boxes"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7, -4, 0)
mesh = SubResource( 7 )
surface_material_override/0 = SubResource( 8 )
mesh = SubResource("7")
surface_material_override/0 = SubResource("8")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.884838, -0.329433, 0.329449, 0, 0.707124, 0.707089, -0.4659, -0.625659, 0.62569, 0, 4.69444, 0)

View File

@@ -6,21 +6,24 @@
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=4
_global_script_classes=[]
_global_script_class_icons={
}
config_version=5
[application]
config/name="Mobile Sensors Demo"
config/description="A demo showing the use of various sensors: an accelerometer, a gyroscope, and a magnetometer.
These sensors are typically found on mobile devices, so don't expect this to work on a desktop."
run/main_scene="res://main.tscn"
config/icon="res://icon.webp"
config/tags=PackedStringArray("demo", "mobile", "official")
run/main_scene="res://main.tscn"
config/features=PackedStringArray("4.1")
config/icon="res://icon.webp"
[display]
window/stretch/mode="canvas_items"
[rendering]
environment/default_environment="res://default_env.tres"
renderer/rendering_method="mobile"
textures/vram_compression/import_etc2_astc=true
environment/defaults/default_environment="res://default_env.tres"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB