1 Pluspunkt 0 Minuspunkte

Wenn ich einen Raycast visualisiere wird die Linie korrekt gezeichnet aber die Sphere landet irgendwo. Wie kann das sein wenn der Endpunkt der Linie der Punkt ist wo die Sphere sein sollte?

func _fire():
	var space = get_world_3d().direct_space_state
	var query = PhysicsRayQueryParameters3D.create(camera.global_position, camera.global_position - camera.global_transform.basis.z * 150)
	var collision = space.intersect_ray(query)
	if collision:
		
		print("Colission with " + collision.collider.get_parent().name)
		
		var hit_position = collision.position
		var hit_normal = collision.normal
		var hit_collider = collision.collider

		var line = ImmediateMesh.new()
		line.surface_begin(Mesh.PRIMITIVE_LINES)
		line.surface_add_vertex(head.global_position)
		line.surface_add_vertex(hit_position)
		line.surface_end()
		
		var line_instance = MeshInstance3D.new()
		line_instance.mesh = line
		line_instance.material_override = StandardMaterial3D.new()
		line_instance.material_override.albedo_color = Color(0, 1, 0)  # Grün
		get_tree().root.add_child(line_instance)
		
		var sphere = MeshInstance3D.new()
		sphere.mesh = SphereMesh.new()
		sphere.mesh.radius = 0.5  # Größe der Kugel
		sphere.material_override = StandardMaterial3D.new()
		sphere.material_override.albedo_color = Color(1, 0, 0)  # Rot
		sphere.global_position = hit_position
		collision.collider.get_parent().add_child(sphere)
von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Du fügst die Sphere als Child des Collider ein

collision.collider.get_parent().add_child(sphere)

Dabei wird die Position der Sphere relativ zum neuen Parent Transform festgelegt. global_position wird dabei in den lokalen Raum des neuen Parent konvertiert. Positioniere die Sphere wie die Linie auch am Root Node deiner Szene. Ersetze

collision.collider.get_parent().add_child(sphere) 
sphere.global_position = hit_position

durch

get_tree().root.add_child(sphere)  
sphere.global_position = hit_position 
von (884 Punkte)