Hallo,
ich bin seid geraumer Zeit dabei ein kleines Spiel zu Programmieren. Ursprünglich haben wir einen kleinen FPS-Shooter innerhalb eines Schulprojekts programmiert, um ein wenig mit DiriectX zu arbeiten.
Dabei hab ich dann wohl irgentwie richtig Bock dran bekommen. Kennt ihr vielleicht
Naja, auf jeden Fall bin ich dabei eine Art KI zu programmieren. Natürlich ist die nicht sehr schlau, aber das ist nun mal das Ziel. Wohl möglich könnte man mit einer anständigen KI Bücher füllen^^
Das laufen anhand von vorgegebenen Pfaden klappt soweit ganz gut. Jetzt müssen die künstlichen Programmierschnipsel noch das Zielen lernen.
Dabei bin ich dann auf ein mathematisches Problem gestoßen, das ich alleine bis jetzt noch nicht lösen konnte. Ich hoffe daher dringendst um eure Hilfe und produktive, anregende Beiträge.
Problemstellung:
Schnittpunkt als D3DXVECTOR3 berechnen, bei dem die "Linie" der Kugel (bedingt durch Gravitation, Geschwindigkeit), die des Gegners (bedingt durch Geschwindigkeit) trifft.
Bekannte Werte:
float projectilSpeed = 2000 m/s //enthält die Geschwindigkeit des Projektils pro Sekunde
float gravitation = 9.81 m/s^2 //endhält die Erdanziehung
D3DXVECTOR3 targetPosition //enthält die Position des Ziels
D3DXVECTOR3 projectilePosition //enthält die Position des Projektils
D3DXVECTOR3 targetSpeed //enthält die Änderung der Position des Gegners pro Sekunde
Variablendefinition:
ProjectilePosition zum Zeitpunkt der Kollision = ProjectilePos_t
TargetPosition zum Zeitpunkt der Kollision = TargetPos_t
ProjectilePosition zum Zeitpunkt 0, jetzt = ProjectilePos_0
TargetPosition zum Zeitpunkt 0, jetzt = TargetPos_0
ZeitZumAufschlag = t
Aim-Winkel = theta
Ansatz:
Ich habe eine Formel gefunden, mit deren Hilfe sich der "Drop" (Abfall des Projektils anhand der Gravitation) berechnen lässt (Quelle Wikipedia):
float drop = 0.5f * gravity * t * t
Die Geschwindigkeit eines Projektils hat natürlich einen horizontalen und vertikalen Anteil und lässt sich wie folgt beschreiben (Quelle Wikipedia):
ProjectilVelocity.x = projectilSpeed * cos(theta)
ProjectilVelocity.y = projectilSpeed * sin(theta)
Also gilt für das Projektil (Quellle mein Kopf):
ProjectilePos_t.x = ProjectilePos_0.x + ProjectileSpeed * t
ProjectilePos_t.y = ProjectilePos_0.y + ProjectileSpeed * t + 0.5f * gravity * t * t
ProjectilePos_t.z = ProjectilePos_0.z + ProjectileSpeed * t
Das Ziel läuft angenommen mit einer Konstanten Geschwindigkeit. Anders gehts nicht.
Dann gilt (Quelle Wikipedia):
TargetPos_t = TargetPos_0 + TargetSpeed * D3DXVECTOR3(t, t, t)
So. Und ab hier weißt ich nicht wieter. Ich muss das ganze ja irgentwie so auflösen, das ich mit bekannten Werten die Geschwindigkeit herausfinde. Der einfchheit halber könnte man natürlich etwas schnelles nehmen wie:
float time = distanz / projectileSpeed
Aber das wäre nicht korrekt, weil das eine lineare "Flugbahn" Vorraussetzen würde, die es wohl nur bei einem Raketenwerfer geben würde
Ich hoffe ich habe das Problem detailliert erklärt. Wenn was fehlt, bitte melden! Manchmal setzt man als Autor ja Sachen vorraus, die einem selber ganz klar sind.
Gruß aus NRW,
Frank
ich bin seid geraumer Zeit dabei ein kleines Spiel zu Programmieren. Ursprünglich haben wir einen kleinen FPS-Shooter innerhalb eines Schulprojekts programmiert, um ein wenig mit DiriectX zu arbeiten.
Dabei hab ich dann wohl irgentwie richtig Bock dran bekommen. Kennt ihr vielleicht

Das laufen anhand von vorgegebenen Pfaden klappt soweit ganz gut. Jetzt müssen die künstlichen Programmierschnipsel noch das Zielen lernen.
Dabei bin ich dann auf ein mathematisches Problem gestoßen, das ich alleine bis jetzt noch nicht lösen konnte. Ich hoffe daher dringendst um eure Hilfe und produktive, anregende Beiträge.
Problemstellung:
Schnittpunkt als D3DXVECTOR3 berechnen, bei dem die "Linie" der Kugel (bedingt durch Gravitation, Geschwindigkeit), die des Gegners (bedingt durch Geschwindigkeit) trifft.
Bekannte Werte:
float projectilSpeed = 2000 m/s //enthält die Geschwindigkeit des Projektils pro Sekunde
float gravitation = 9.81 m/s^2 //endhält die Erdanziehung
D3DXVECTOR3 targetPosition //enthält die Position des Ziels
D3DXVECTOR3 projectilePosition //enthält die Position des Projektils
D3DXVECTOR3 targetSpeed //enthält die Änderung der Position des Gegners pro Sekunde
Variablendefinition:
ProjectilePosition zum Zeitpunkt der Kollision = ProjectilePos_t
TargetPosition zum Zeitpunkt der Kollision = TargetPos_t
ProjectilePosition zum Zeitpunkt 0, jetzt = ProjectilePos_0
TargetPosition zum Zeitpunkt 0, jetzt = TargetPos_0
ZeitZumAufschlag = t
Aim-Winkel = theta
Ansatz:
Ich habe eine Formel gefunden, mit deren Hilfe sich der "Drop" (Abfall des Projektils anhand der Gravitation) berechnen lässt (Quelle Wikipedia):
float drop = 0.5f * gravity * t * t
Die Geschwindigkeit eines Projektils hat natürlich einen horizontalen und vertikalen Anteil und lässt sich wie folgt beschreiben (Quelle Wikipedia):
ProjectilVelocity.x = projectilSpeed * cos(theta)
ProjectilVelocity.y = projectilSpeed * sin(theta)
Also gilt für das Projektil (Quellle mein Kopf):
ProjectilePos_t.x = ProjectilePos_0.x + ProjectileSpeed * t
ProjectilePos_t.y = ProjectilePos_0.y + ProjectileSpeed * t + 0.5f * gravity * t * t
ProjectilePos_t.z = ProjectilePos_0.z + ProjectileSpeed * t
Das Ziel läuft angenommen mit einer Konstanten Geschwindigkeit. Anders gehts nicht.
Dann gilt (Quelle Wikipedia):
TargetPos_t = TargetPos_0 + TargetSpeed * D3DXVECTOR3(t, t, t)
So. Und ab hier weißt ich nicht wieter. Ich muss das ganze ja irgentwie so auflösen, das ich mit bekannten Werten die Geschwindigkeit herausfinde. Der einfchheit halber könnte man natürlich etwas schnelles nehmen wie:
float time = distanz / projectileSpeed
Aber das wäre nicht korrekt, weil das eine lineare "Flugbahn" Vorraussetzen würde, die es wohl nur bei einem Raketenwerfer geben würde

Ich hoffe ich habe das Problem detailliert erklärt. Wenn was fehlt, bitte melden! Manchmal setzt man als Autor ja Sachen vorraus, die einem selber ganz klar sind.
Gruß aus NRW,
Frank