Godot Version
4.4
Question
Im trying to let a path3d follow the height difference of a terrain(Terrain3D) and found something about a script using raycast.
But what I try is not working. Anyone familiar with this?
extends Path3D
@export var terrain: Node3D # Sleep hier je Terrain3D-node in
@export var start_point: Vector3 = Vector3(0, 0, 0) # Startpunt van het pad
@export var end_point: Vector3 = Vector3(100, 0, 100) # Eindpunt van het pad
@export var point_count: int = 10 # Aantal punten langs het pad
func _ready():
if terrain == null:
push_error("Geen Terrain3D gekoppeld! Koppel een terrein in de editor.")
return
# Genereer punten tussen start- en eindpunt
var points = generate_points(start_point, end_point, point_count)
var adjusted_points = []
for point in points:
var height = get_terrain_height(point.x, point.z)
adjusted_points.append(Vector3(point.x, height, point.z))
# Stel de Path3D-curve in met de aangepaste punten
curve.clear_points()
for adjusted_point in adjusted_points:
curve.add_point(adjusted_point)
func generate_points(start: Vector3, end: Vector3, count: int) -> Array:
var points = []
for i in range(count):
var t = float(i) / (count - 1) # Normaliseer tussen 0 en 1
points.append(start.lerp(end, t))
return points
func get_terrain_height(x: float, z: float) -> float:
var ray = {
"from": Vector3(x, 1000, z), # Raycast startpositie (hoog boven het terrein)
"to": Vector3(x, -1000, z) # Raycast eindpositie (laag onder het terrein)
}
var space_state = get_world_3d().direct_space_state
var result = space_state.intersect_ray(ray) # Ray-informatie wordt als dictionary meegegeven
if result.has("position"):
return result.position.y # Retourneer de y-hoogte van het terrein
return 0 # Standaardhoogte als er geen hit is