3 Pluspunkte 0 Minuspunkte

Ich möchte mehrere Raycast in eine bestimmte Richtung machen und dabei jeweils eine kleine Streuung hinzufügen um eine Pumpgun mit mehreren Projektilen zu simulieren.

func randomize_spread(base_vector: Vector3, angle: float) -> Vector3:
    var random_pitch = randf_range(-angle, angle) * (PI / 180)
    var random_yaw = randf_range(-angle, angle) * (PI / 180)
    var rotated_vector = base_vector.rotated(Vector3.UP, random_yaw).rotated(Vector3.RIGHT, random_pitch)
    var normalized_vector = rotated_vector.normalized()

Das komische ist wenn ich nach vorne oder hinten schaue funktioniert der Spread, wenn ich nach links und rechts schaue aber nicht. Ich finde den Fehler einfach nicht.

von  

2 Antworten

1 Pluspunkt 0 Minuspunkte

Richte jeden Strahl anhand eines zufälligen Winkel und einer zufälligen Abweichung aus.

func randomize_spread_in_circle(base_vector: Vector3, angle: float) -> Vector3:

    # Polarkoordinaten generieren
    var random_angle = randf() * TAU  # Zufälliger Winkel (0 bis 2*PI)
    var random_radius = randf() * angle  # Zufällige Abweichung bis zum Maximalwinkel

    # Grad in Radiant umwandeln
    random_radius = random_radius * (PI / 180)

    # Streuwinkel auf Basisvektor anwenden
    var camera_basis = maincamera.global_transform.basis
    var spread_vector = base_vector

    # Rotationen auf Basis der Kamera
    spread_vector = spread_vector.rotated(camera_basis.y, random_radius * cos(random_angle))  # Horizontal
    spread_vector = spread_vector.rotated(camera_basis.x, random_radius * sin(random_angle))  # Vertikal

    return spread_vector.normalized()
von (984 Punkte)  
0 Pluspunkte 0 Minuspunkte

Du wendest die Rotation auf den Basisvector an wodurch die Streuung in einem festen Koordinatensystem (weltbasiert) verankert bleibt und sich nicht an der Blickrichtung der Kamera orientiert.

func randomize_spread(base_vector: Vector3, angle: float) -> Vector3:
    var random_pitch = randf_range(-angle, angle) * (PI / 180)
    var random_yaw = randf_range(-angle, angle) * (PI / 180)

    # Lokale Basis der Kamera verwenden
    var camera_basis = maincamera.global_transform.basis
    var spread_vector = base_vector
    spread_vector = spread_vector.rotated(camera_basis.y, random_yaw)  # Y-Achse der Kamera für horizontale Streuung
    spread_vector = spread_vector.rotated(camera_basis.x, random_pitch)  # X-Achse der Kamera für vertikale Streuung

    return spread_vector.normalized()
von (660 Punkte)