Gleichmäßiges Drehen eines Entitys zu einem anderen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

joshmami

Betreff: Gleichmäßiges Drehen eines Entitys zu einem anderen

BeitragDo, Jan 05, 2012 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Community,
Ich habe folgendes Problem:
In dem Flugzeug-Spiel das ich gerade programmiere sollen die Gegner den Spieler "verfolgen".
Allerdings sollen die Gegner-Flugzeuge natürlich auch nur ein begrenztes Handling haben, also kann ich das ganze nicht mit PointEntity regeln, da dabei sich die Gegner ja sofort zum Spieler drehen würden.
Es kann gut sein, dass es einen einfachen mathematischen Berechnungsweg gibt, den ich in der Schule noch nicht hatte, deswegen frage ich ja euch Smile
Mfg Joshmami

Nicdel

BeitragDo, Jan 05, 2012 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Winkel ausrechnen, dann mit TurnEntity langsam drehen.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

joshmami

BeitragDo, Jan 05, 2012 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Klingt einfach, ist es aber nicht Very Happy
1. Wie soll man den Winkel berechnen?
2.Da sich beide Entities mit möglicherweise unterschiedlicher Geschwindigkeit bewegen, ändert sich ja auch der Winkel ständig
3. Ist das ganze ja auch noch im 3-Dimensionalem Raum, daher bräuchte man eher mindestens 2 Winkel
Mfg Joshmami

Nicdel

BeitragDo, Jan 05, 2012 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würd mir das so vorstellen (2D):

user posted image

Winkel A und B kann man dann mit Hilfe von sin/cos/tan ausrechnen.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

joshmami

BeitragFr, Jan 06, 2012 0:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe das ganze jetzt nach langen vergeblichen Bemühungen Tobchens im Chat doch mit AlignToVector gelöst, wie Xeres mir geraten hatte.
Danke an alle, die sich darüber Gedanken gemacht haben Smile
Mfg Joshmami

darth

BeitragFr, Jan 06, 2012 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Aaaaw.. und grad jetzt wo ich fertig bin Sad

Trotzdem:
BlitzBasic: [AUSKLAPPEN]
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()
Local timer = CreateTimer(60)

Local phi#, px#, py#, ax#, ay#
Local vPhi#, v#

v = 1
vPhi = 1

phi = 0
px = 400
py = 300

While Not KeyHit(1)
;zeichne spieler
Line px + Cos(phi) * 10, py + Sin(phi) * 10, px - Cos(phi) * 10 + Sin(phi) * 5, py - Sin(phi) * 10 - Cos(phi) * 5
Line px + Cos(phi) * 10, py + Sin(phi) * 10, px - Cos(phi) * 10 - Sin(phi) * 5, py - Sin(phi) * 10 + Cos(phi) * 5
Line px - Cos(phi) * 10 + Sin(phi) * 5, py - Sin(phi) * 10 - Cos(phi) * 5, px - Cos(phi) * 10 - Sin(phi) * 5, py - Sin(phi) * 10 + Cos(phi) * 5

;setze ziel
ax = MouseX()
ay = MouseY()

;zeichne ziel
Oval ax -3, ay -3, 6, 6

;player bewegen
Local dx#, dy#, dPhi#, tx#, ty#

dx = ax - px
dy = ay - py

tx = Cos(-phi) * dx - Sin(-phi) * dy
ty = Sin(-phi) * dx + Cos(-phi) * dy

dPhi = ATan2(ty, tx)

If Abs(dPhi) > vPhi
dPhi = Sgn(dPhi) * vPhi
EndIf

;spieler bewegen
phi = phi + dPhi

px = px + Cos(phi) * v
py = py + Sin(phi) * v

Flip 0
WaitTimer(timer)
Cls
Wend
End


Prinzipiell:
(1) Man berechnet den Winkel zwischen der Geschwindigkeit des Flugzeugs (das hat ja eine Richtung nach vorne, also ausgedrückt im Winkel phi) V
(2) und dem Vektor zum Ziel D.
Weil der generelle ACos(V*D) nur positive Zahlen liefert,
(3) drehe ich D ins System von V (d.h V = [1;0]) und nehme dann den ATan2(T) vom gedrehten Vektor T.
(4) Dann ein bisschen croppen auf eine maximale Winkelgeschwindigkeit et voilà.

Der olle Xeres hat sich beschwert, dass meine Erklärung nicht verständlich sei (lern Mathe, faules Aas!), daher ein Erklärbild (ohne Elefanten, das überlasse ich den Trollen, lulz!):

user posted image

Erweitern zu 3D ist straightforward, man betrachtet das Problem separat auf zwei Ebenen (einmal XZ, einmal YZ - oder permutiert, jenachdem wie man sein Flugzeug ausrichtet).

MfG,
Darth

Mr.Keks

BeitragFr, Jan 06, 2012 3:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Was spricht gegen DeltaYaw und DeltaPitch? (Es gab irgendeinen Spezialfall, in dem die fehlerhafte Ergebnisse liefern, wofür man dann so wie darth arbeiten muss. Aber bevor du das Problem erreichst, sind die beiden doch erstmal deine Freunde.)
MrKeks.net

joshmami

BeitragFr, Jan 06, 2012 3:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Oha, das hört sich besser regulierbarer als AlignToVector an und ist für mich weniger kompliziert als Darth's Riesenlösung Wink
Danke Cool
Mfg Joshmami

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group