Random object rotating

Godot Version

4.3

Question

Hi,

I have my script where I place 2 different objects randomly on a path3d.
I also want to rotate randomly how the object is placed, therefore I use:

var random_rotation_x = randf_range(0, PI * 2) # Roteer tussen 0 en 360 graden
		var random_rotation_y = randf_range(0, PI * 2) # Roteer tussen 0 en 360 graden
		fence_instance.rotation_degrees.x = random_rotation_x
		fence_instance.rotation_degrees.y = random_rotation_y

But it is not rotating. All the objects are placed the same.

Can someone help how to use this? Here the whole script:

@tool
extends Path3D

@export var fence_scene1 = preload("res://fence.tscn")
@export var fence_scene2 = preload("res://fence2.tscn")
@export var spacing = 0.2

func _ready():
	# Zorg ervoor dat de node "VisibleItems" bestaat
	if !$VisibleItems3:
		var visible_items = Node3D.new()
		visible_items.name = "VisibleItems3"
		add_child(visible_items)
	spawn_fences()

func spawn_fences():
	# Verwijder bestaande hekken van "VisibleItems"
	for child in $VisibleItems3.get_children():
		child.queue_free()

	var current_distance = 0.0

	while current_distance < curve.get_baked_length():
		var pos = curve.sample_baked(current_distance)
		var up_vector = curve.sample_baked_up_vector(current_distance)

		# Maak een nieuw hek, willekeurig gekozen tussen fence_scene1 en fence_scene2
		var fence_instance
		if randf() < 0.5:
			fence_instance = fence_scene1.instantiate()
		else:
			fence_instance = fence_scene2.instantiate()

		# Willekeurig roteren op de x- en y-as
		var random_rotation_x = randf_range(0, PI * 2) # Roteer tussen 0 en 360 graden
		var random_rotation_y = randf_range(0, PI * 2) # Roteer tussen 0 en 360 graden
		fence_instance.rotation_degrees.x = random_rotation_x
		fence_instance.rotation_degrees.y = random_rotation_y

		fence_instance.global_transform.origin = pos
		fence_instance.look_at(pos + curve.sample_baked_up_vector(current_distance), up_vector)
		$VisibleItems3.add_child(fence_instance)

		# Verhoog de afstand met 0.2 meter
		current_distance += spacing

you are calling “look_at” which sets the rotation to the specifiec location, overriding your previously set rotation

1 Like

Now it is working:

@tool
extends Path3D

@export var fence_scene1 = preload("res://fence.tscn")
@export var fence_scene2 = preload("res://fence2.tscn")
@export var spacing = 0.3

func _ready():
	# Zorg ervoor dat de node "VisibleItems" bestaat
	if !$VisibleItems3:
		var visible_items = Node3D.new()
		visible_items.name = "VisibleItems3"
		add_child(visible_items)
	spawn_fences()

func spawn_fences():
	# Verwijder bestaande hekken van "VisibleItems"
	for child in $VisibleItems3.get_children():
		child.queue_free()

	var current_distance = 0.0

	while current_distance < curve.get_baked_length():
		var pos = curve.sample_baked(current_distance)
		var up_vector = curve.sample_baked_up_vector(current_distance)

		# Maak een nieuw hek, willekeurig gekozen tussen fence_scene1 en fence_scene2
		var fence_instance
		if randf() < 0.5:
			fence_instance = fence_scene1.instantiate()
		else:
			fence_instance = fence_scene2.instantiate()
			
		fence_instance.global_transform.origin = pos
		fence_instance.look_at(pos + curve.sample_baked_up_vector(current_distance), up_vector)
		
		# Willekeurige horizontale rotatie
		var random_rotation = randf_range(0.0, 2.0 * PI)
		fence_instance.rotate_y(random_rotation)
		
		$VisibleItems3.add_child(fence_instance)

		# Verhoog de afstand met 0.2 meter
		current_distance += spacing

func randf_range(min: float, max: float) -> float:
	return min + (max - min) * randf()