Files
kicking-high/proto3/godot/scenes/debug/steering_test.gd
2020-04-13 12:45:25 +03:00

100 lines
3.4 KiB
GDScript3

extends Spatial
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
func _physics_process(delta):
for g in get_tree().get_nodes_in_group("agent"):
var bb = g
var space_state = g.get_world().direct_space_state
var up = Vector3(0, 1, 0)
var npc_pos = g.global_transform.origin
var front = -g.global_transform.basis[2]
var right = g.global_transform.basis[0]
var front_result = space_state.intersect_ray(npc_pos + up, npc_pos + up + front * 0.6,
[g], 0xffff)
bb.set("front_result", front_result)
var front_right_result = space_state.intersect_ray(npc_pos + up + right * 0.1, npc_pos + up + front * 0.8 + right * 0.3,
[g], 0xffff)
bb.set("front_right_result", front_right_result)
var front_left_result = space_state.intersect_ray(npc_pos + up - right * 0.1, npc_pos + up + front * 0.8 - right * 0.3,
[g], 0xffff)
bb.set("front_left_result", front_left_result)
var low_obstacle_result = space_state.intersect_ray(npc_pos + up * 0.3, npc_pos + up * 0.3 + front * 0.6,
[g], 0xffff)
bb.set("low_obstacle_result", low_obstacle_result)
for g in get_tree().get_nodes_in_group("agent"):
var bb = g
var front_result = bb.get("front_result")
var front_left_result = bb.get("front_left_result")
var front_right_result = bb.get("front_right_result")
var low_obstacle_result = bb.get("low_obstacle_result")
var front_col = false
var left_col = false
var right_col = false
var low_obstacle = false
if front_result.has("collider"):
var col = front_result.collider
if !col.is_in_group("entry"):
front_col = true
front_col = true
if front_left_result.has("collider"):
var col = front_left_result.collider
if !col.is_in_group("entry"):
left_col = true
left_col = true
if front_right_result.has("collider"):
var col = front_right_result.collider
if !col.is_in_group("entry"):
right_col = true
right_col = true
if !front_col:
if low_obstacle_result.has("collider"):
var col = low_obstacle_result.collider
if !col.is_in_group("entry"):
low_obstacle = true
# if left_col && right_col:
# if low_obstacle:
# npc.disable_gravity = true
# var c = [["set", "parameters/climb_low_obstacle/active", true]]
# npc.smart_obj(c)
var npc = g
var rot: Basis = npc.orientation.basis
if front_col:
var normal = front_result.normal
var xnormal = npc.global_transform.xform_inv(normal)
print("normal ", normal)
print("xnormal ", xnormal)
# var ok = false
# if xnormal.x < 0:
# rot = rot.rotated(Vector3(0, 1, 0), deg2rad(30 + 0.2 * (0.5 - randf())))
# ok = true
# elif xnormal.x > 0:
# rot = rot.rotated(Vector3(0, 1, 0), deg2rad(-30 + 0.2 * (0.5 - randf())))
# ok = true
if left_col && !right_col:
rot = rot.rotated(Vector3(0, 1, 0), deg2rad(-100 - 15.2 * (0.5 - randf())))
print("l")
elif right_col && !left_col:
rot = rot.rotated(Vector3(0, 1, 0), deg2rad(100 + 15.2 * (0.5 - randf())))
print("r")
elif right_col && left_col:
rot = rot.rotated(Vector3(0, 1, 0), npc.unp_fixup_angle)
# else:
# rot = rot.rotated(Vector3(0, 1, 0), deg2rad(10 + 10.0 * (0.5 - randf())))
var cur: Basis = npc.orientation.basis
cur = cur.slerp(rot, get_process_delta_time())
npc.orientation.basis = cur