2 Pluspunkte 0 Minuspunkte

Wie kann ich an der Stelle wo ein Raycast mit einem Colider kollidiert, ein kleines schwarzes Plane als Art Bullethole als Child des Colider befestigen das sich automatisch so ausrichtet dass es aussieht als würde es auf dem Colider kleben?

func shoot():
    var space = get_world_3d().direct_space_state
    var query = PhysicsRayQueryParameters3D.create(head.global_position, head.global_position - head.global_transform.basis.z * 50)
    var collision = space.intersect_ray(query)
    if collision:
        var plane = MeshInstance3D.new()
		plane.mesh = PlaneMesh.new()
		plane.mesh.size = Vector2(0.1, 0.1)
		plane.material_override = StandardMaterial3D.new()
		plane.material_override.albedo_color = Color(1, 0, 0) # Rot
		plane.global_position = hit_position
		get_tree().root.add_child(plane)
von  

1 Antwort

1 Pluspunkt 0 Minuspunkte

Dazu kannst du dir eine Funktion schreiben.

func align_with_normal(element, normal):
    element.basis.y = normal
    element.basis.x = -element.basis.z.cross(normal)
    element.basis = element.basis.orthonormalized()
    return element

und das Bullethole anhand der Normalen des Raycast ausrichten.

plane.global_transform = align_with_normal(plane.global_transform, collision.normal)
von (884 Punkte)  
Jetzt scheinen die beiden Oberflächen aber direkt übereinander zu liegen. Kann man das Bullethole ein kleines bisschen vor die Collision setzen?
Du kannst das Bullethole entlang der Normalen (Rechter Winkel auf die Oberfläche) verschieben.

plane.global_position += collision.normal * 0.01