small racing game im working on
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
extends Car
class_name AICar
const num_rays := 32
const look_ahead := 40.0
const hidden_nodes := 17
const output_nodes := 3
var rays: Array[RayCast3D]
var nn: NeuralNetwork
func _ready():
super()
randomize()
engine_force *= randf_range(0.8, 1)
add_rays()
# +1 for speed
nn = NeuralNetwork.new(num_rays + 1, hidden_nodes, output_nodes)
func add_rays():
var n: float = 2 * PI / num_rays
var ray_holder := $CarMesh/ContextRays
for i in num_rays:
var r := RayCast3D.new()
ray_holder.add_child(r)
r.target_position = Vector3.FORWARD * look_ahead
r.rotation.y = (-n * i)
rays.append(r)
func get_distances() -> Array[float]:
var distances: Array[float] = []
for i in num_rays:
var distance: float = 1.0
if rays[i].is_colliding():
var raycast_length: float = rays[i].target_position.y
var collision: Vector3 = rays[i].get_collision_point()
distance = rays[i].global_transform.origin.distance_to(collision) / raycast_length
distances.append(distance)
return distances
func _physics_process(delta: float) -> void:
var distances := get_distances()
distances.append(kph())
var outputs := nn.predict(distances) # [steer_l, throt, steer_r]
print(outputs)
# var steer_target = (outputs[0] - outputs[2]) * max_steering_range
# throttle = acceleration * outputs[1]
steer(steer_target)
super(delta)
|