Skip to content

Commit 7bf07a8

Browse files
lawnjellyCalinou
authored andcommitted
Add 3D physics interpolation demo
Demonstrate first person shooter and third person shooter cameras.
1 parent 0d6b772 commit 7bf07a8

18 files changed

+784
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8

3d/physics_interpolation/README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Physics Interpolation
2+
3+
This demo showcases [physics interpolation](https://docs.godotengine.org/en/stable/tutorials/physics/interpolation/index.html)
4+
in 3D with varying camera modes (first person, third person, fixed perspective).
5+
This is also known as *fixed timestep interpolation*.
6+
7+
Physics interpolation makes motion appear smooth regardless of the rendered
8+
framerate and physics ticks per second configured in the Project Settings.
9+
There are some caveats related to its usage though, such as increased latency
10+
and potential issues with teleporting objects. It's recommended to go
11+
through the
12+
[documentation](https://docs.godotengine.org/en/stable/tutorials/physics/interpolation/physics_interpolation_introduction.html)
13+
when enabling physics interpolation in a project.
14+
15+
Physics interpolation is enabled by default in this project. Press <kbd>T</kbd>
16+
to toggle it while the demo is running. This allows you to see the impact on
17+
smoothness of physics interpolation.
18+
19+
Language: GDScript
20+
21+
Renderer: Compatibility
22+
23+
## Screenshots
24+
25+
![Screenshot](screenshots/physics_interpolation.webp)

3d/physics_interpolation/box.tscn

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[gd_scene load_steps=4 format=3 uid="uid://cvgxw8nq67xxm"]
2+
3+
[sub_resource type="BoxShape3D" id="BoxShape3D_pq8q7"]
4+
5+
[sub_resource type="BoxMesh" id="BoxMesh_pyidc"]
6+
7+
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_oq5cr"]
8+
albedo_color = Color(0.5544661, 0.39379695, 0.15444939, 1)
9+
10+
[node name="Box" type="RigidBody3D"]
11+
mass = 10.0
12+
13+
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
14+
shape = SubResource("BoxShape3D_pq8q7")
15+
16+
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
17+
mesh = SubResource("BoxMesh_pyidc")
18+
surface_material_override/0 = SubResource("StandardMaterial3D_oq5cr")

3d/physics_interpolation/bullet.gd

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
extends RigidBody3D
2+
3+
@export var scale_curve: Curve
4+
5+
var _enabled := false
6+
7+
8+
func _ready() -> void:
9+
$CollisionShape3D.disabled = true
10+
11+
12+
func _physics_process(_delta: float) -> void:
13+
# Start with physics collision disabled until the first tick.
14+
# This prevents bullets from colliding with the player when first shot, while still
15+
# allowing them to be moved by the player when they're laying on the ground.
16+
if !_enabled:
17+
$CollisionShape3D.disabled = false
18+
_enabled = true
19+
20+
# Apply the appearance scaling according to the scale curve.
21+
var time_left_ratio: float = 1.0 - $Timer.time_left / $Timer.wait_time
22+
var scale_sampled := scale_curve.sample_baked(time_left_ratio)
23+
$Scaler.scale = Vector3.ONE * scale_sampled
24+
25+
26+
func _on_timer_timeout() -> void:
27+
queue_free()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
uid://dohdjr8ilotkr

3d/physics_interpolation/bullet.tscn

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
[gd_scene load_steps=15 format=3 uid="uid://2r5wc1n0ybju"]
2+
3+
[ext_resource type="Script" uid="uid://dohdjr8ilotkr" path="res://bullet.gd" id="1_v7oki"]
4+
[ext_resource type="Texture2D" uid="uid://b70s43gn8c3kx" path="res://spark_particle.png" id="2_v8qja"]
5+
6+
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_v8qja"]
7+
bounce = 0.61
8+
9+
[sub_resource type="Curve" id="Curve_t4vbm"]
10+
_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.02, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
11+
point_count = 3
12+
13+
[sub_resource type="SphereShape3D" id="SphereShape3D_rtl8c"]
14+
radius = 0.2
15+
16+
[sub_resource type="Gradient" id="Gradient_v8qja"]
17+
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0)
18+
19+
[sub_resource type="GradientTexture1D" id="GradientTexture1D_t4vbm"]
20+
gradient = SubResource("Gradient_v8qja")
21+
22+
[sub_resource type="Curve" id="Curve_v8qja"]
23+
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
24+
point_count = 2
25+
26+
[sub_resource type="CurveTexture" id="CurveTexture_t4vbm"]
27+
curve = SubResource("Curve_v8qja")
28+
29+
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_v7oki"]
30+
direction = Vector3(0, 1, 0)
31+
initial_velocity_max = 1.0
32+
gravity = Vector3(0, 1, 0)
33+
scale_min = 0.2
34+
scale_curve = SubResource("CurveTexture_t4vbm")
35+
color_ramp = SubResource("GradientTexture1D_t4vbm")
36+
37+
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_t4vbm"]
38+
transparency = 1
39+
blend_mode = 1
40+
shading_mode = 0
41+
vertex_color_use_as_albedo = true
42+
albedo_color = Color(2.33575, 3.29442, 3.29442, 1)
43+
albedo_texture = ExtResource("2_v8qja")
44+
texture_filter = 5
45+
46+
[sub_resource type="QuadMesh" id="QuadMesh_rtl8c"]
47+
material = SubResource("StandardMaterial3D_t4vbm")
48+
size = Vector2(0.2, 0.2)
49+
50+
[sub_resource type="SphereMesh" id="SphereMesh_v7oki"]
51+
radial_segments = 24
52+
rings = 12
53+
54+
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_v7oki"]
55+
albedo_color = Color(0.431649, 0.57319, 0.501392, 1)
56+
metallic = 1.0
57+
58+
[node name="Bullet" type="RigidBody3D"]
59+
collision_layer = 2
60+
physics_material_override = SubResource("PhysicsMaterial_v8qja")
61+
script = ExtResource("1_v7oki")
62+
scale_curve = SubResource("Curve_t4vbm")
63+
64+
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
65+
shape = SubResource("SphereShape3D_rtl8c")
66+
67+
[node name="GPUParticles3D" type="GPUParticles3D" parent="."]
68+
amount = 64
69+
transform_align = 1
70+
process_material = SubResource("ParticleProcessMaterial_v7oki")
71+
draw_pass_1 = SubResource("QuadMesh_rtl8c")
72+
73+
[node name="Scaler" type="Node3D" parent="."]
74+
transform = Transform3D(0.001, 0, 0, 0, 0.001, 0, 0, 0, 0.001, 0, 0, 0)
75+
76+
[node name="MeshInstance3D" type="MeshInstance3D" parent="Scaler"]
77+
transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, 0, 0, 0)
78+
mesh = SubResource("SphereMesh_v7oki")
79+
skeleton = NodePath("../..")
80+
surface_material_override/0 = SubResource("StandardMaterial3D_v7oki")
81+
82+
[node name="Timer" type="Timer" parent="."]
83+
wait_time = 5.0
84+
autostart = true
85+
86+
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://c5avn6uhdr88"
6+
path.s3tc="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.ctex"
7+
metadata={
8+
"imported_formats": ["s3tc_bptc"],
9+
"vram_texture": true
10+
}
11+
12+
[deps]
13+
14+
source_file="res://icon.png"
15+
dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.ctex"]
16+
17+
[params]
18+
19+
compress/mode=2
20+
compress/high_quality=false
21+
compress/lossy_quality=0.7
22+
compress/uastc_level=0
23+
compress/rdo_quality_loss=0.0
24+
compress/hdr_compression=1
25+
compress/normal_map=0
26+
compress/channel_pack=0
27+
mipmaps/generate=true
28+
mipmaps/limit=-1
29+
roughness/mode=0
30+
roughness/src_normal=""
31+
process/channel_remap/red=0
32+
process/channel_remap/green=1
33+
process/channel_remap/blue=2
34+
process/channel_remap/alpha=3
35+
process/fix_alpha_border=true
36+
process/premult_alpha=false
37+
process/normal_map_invert_y=false
38+
process/hdr_as_srgb=false
39+
process/hdr_clamp_exposure=false
40+
process/size_limit=0
41+
detect_3d/compress_to=0

3d/physics_interpolation/icon.svg

Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://cb05v27t8vx5t"
6+
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
7+
metadata={
8+
"vram_texture": false
9+
}
10+
11+
[deps]
12+
13+
source_file="res://icon.svg"
14+
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
15+
16+
[params]
17+
18+
compress/mode=0
19+
compress/high_quality=false
20+
compress/lossy_quality=0.7
21+
compress/uastc_level=0
22+
compress/rdo_quality_loss=0.0
23+
compress/hdr_compression=1
24+
compress/normal_map=0
25+
compress/channel_pack=0
26+
mipmaps/generate=false
27+
mipmaps/limit=-1
28+
roughness/mode=0
29+
roughness/src_normal=""
30+
process/channel_remap/red=0
31+
process/channel_remap/green=1
32+
process/channel_remap/blue=2
33+
process/channel_remap/alpha=3
34+
process/fix_alpha_border=true
35+
process/premult_alpha=false
36+
process/normal_map_invert_y=false
37+
process/hdr_as_srgb=false
38+
process/hdr_clamp_exposure=false
39+
process/size_limit=0
40+
detect_3d/compress_to=0
41+
svg/scale=1.0
42+
editor/scale_with_editor_scale=false
43+
editor/convert_colors_with_editor_theme=false

0 commit comments

Comments
 (0)