Winkel und andere Katastrophen... (Erledigt !)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Bura.Tino

Betreff: Winkel und andere Katastrophen... (Erledigt !)

BeitragSo, Aug 19, 2007 23:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Servus.

Ich seh mal wieder den Wald vor lauter Bäumen nicht und hoffe das mir jemand weiterhelfen kann.

Folgendes Problem:

Zwei Objekte, davon eins beweglich und das andere starr.
Nun brauch ich den Winkel, der angibt, ob das bewegliche Objekt in Richtung des unbeweglichen zeigt.

Ich hab das folgendermaßen versucht:
Zuerst ermittelte ich den Winkel zwischen den zwei Objekten und zog vom Ergebnis den aktuellen Winkel des bewegbaren Objektes ab.
Soweit funktionierte das auch, allerdings brauch ich den Endwert als Winkel zwischen -180 und +180.

Hat jemand eine Idee wie man das am besten umsetzen kann ?
Ich hab schon viel probiert und denke auch, daß die Lösung relativ simple ist, aber ich hab grad 'ne völlige Denkblockade.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
  • Zuletzt bearbeitet von Bura.Tino am Mo, Aug 27, 2007 6:44, insgesamt 2-mal bearbeitet
 

Dreamora

BeitragSo, Aug 19, 2007 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Was für winkel erhälst du denn? 0 - 360? dann rechne einfach - 180
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Bura.Tino

BeitragSo, Aug 19, 2007 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja...Das is so einfach nicht zu beantworten, weil die Werte völlig komisch sind.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Aug 19, 2007 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ist nichts komische dran. Vielleicht hast du irgendwelche Variablen verwechselt?

Hier mal ein BeispielCode: [AUSKLAPPEN]
Graphics 512,512,0,2
SetBuffer BackBuffer()

xp=256
yp=256


While Not KeyHit(1)
 mx=MouseX()
 my=MouseY()
 If MouseHit(1) xp=mx:yp=my

 wk#=ATan2(my-yp,mx-xp)
 Line xp,yp,xp+Cos(wk)*100,yp+Sin(wk)*100

 Flip
 Cls
Wend
End

Das einzige wo es Probleme geben könnte ist, wenn du dem unbewegtem Objekt eine Drehträgheit verleitest. Dann muss der Sprung zwischen 0° und dem selben Darstellungswinkel von 360° mit berücksichtigt werden. In diesem Fall sollte das Winkelproblem auch wieder mit Winkeln geschlagen werden. Dazu mal folgenden BeispielCode: [AUSKLAPPEN]
Graphics 512,512,0,2
SetBuffer BackBuffer()

xp=256
yp=256
rw#=90 ;Ist-Rotationswinkel
rr#=0 ;Soll-Rotationswinkel


While Not KeyHit(1)
 mx=MouseX()
 my=MouseY()
 If MouseHit(1) xp=mx:yp=my

 rr=ATan2(my-yp,mx-xp)
 rw=rw+Sgn(Sin(rr-rw))
 Line xp,yp,xp+Cos(rw)*20,yp+Sin(rw)*20

 Flip
 Cls
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Bura.Tino

BeitragMo, Aug 20, 2007 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@hectic

Danke für Deine Bemühungen, aber ich glaub Du hast mich falsch verstanden.

Mal ein Beispiel:

Stell Dir vor Du sitzt in einem Auto und fährst über eine große eingezäunte Fläche die nur einen Ausgang hat. Blöderweise hast Du Deine Scheiben so sehr abgetönt (*g*) das Du nichts siehst was sich außerhalb des Autos befindet.
Im Auto ist aber eine Anzeige auf der eine Zahl angezeigt wird, woran Du erkennst, wie viel Grad Du mit Deinem Auto vom Ausgang abweichst. Wenn also die Front exakt zum Ausgang zeigt, so zeigt die Anzeige '0°' an. Wenn sie 1-180° anzeigt weißt Du, daß Du nach links fahren musst und im negativen Zahlenbereich nach links.

Dieses Beispiel ist zwar sehr weit hergeholt, aber so kann man sich es vielleicht am ehesten vorstellen.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

Dreamora

BeitragMo, Aug 20, 2007 0:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Reden wir hier von 2D oder 3D?

In 2D ist es einfach: Berechne den Winkel zwischen dem start und zielpunkt gemessen an der horizontale nach rechts (das ist IMMER die 0 achse): atan2(ydifferenz, xdifferenz)
damit weisst du den winkel und von dem ziehst du deine Abweichung von der 0 Achse ab, sprich wenn du gerade nach oben gucken würdest, würdest du 90° abziehen. Wäre die ausfahrt auch dort, hättest du 0 -> antwort.

Damit du jetzt noch deine -180 - 180 Antwort erhälst musst du dir ne kleine Funktion schreiben die mit Fahrzeug rotation und ausrichtungswinkel die korrekte antwort erzeugt (zumindest für den anfang, bis du eine geschlossene formel entwickelt hast nach einigen zeichnungen und dreiecks winkelberechnungsüberlegungen sowie trigonometrischen identitäten Smile )

3d geht übrigens gleich, dort ist der winkel einfach der drehwinkel an der "nach oben ausgerichteten Achse", normalerweise Y in Blitz
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Bura.Tino

BeitragMo, Aug 20, 2007 0:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht um 3D, aber das is in dem Sinne ja fast das Gleiche wie 2D.
Genauso hab ich es ja auch gemacht, aber ich es funktioniert halt nicht so wie ich will. Sad
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

Dreamora

BeitragMo, Aug 20, 2007 1:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann bitte Mal den Source posten oder einen Mini Source der das Problem aufzeigt und kompiliert.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Bura.Tino

BeitragMo, Aug 20, 2007 1:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok. Hier der Code:
(sp=Starres Objekt; bp=Bewegbares Objekt)

Code: [AUSKLAPPEN]

Winkel=ATan2(BPZ-SPZ,BPX-SPX)
Winkel2=Winkel-EntityYaw(BP)+90
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

Dreamora

BeitragMo, Aug 20, 2007 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Wozu die +90
2. Was funktioniert genau nicht?
-> was ich möchte ist "was ich bekomme" und "was ich gerne hätte"
Ausser du hast ne möglichkeit das wir in deinen Kopf einlinken können ^^
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

StepTiger

BeitragMo, Aug 20, 2007 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Was für winkel erhälst du denn? 0 - 360? dann rechne einfach - 180

Ist nicht richtig.

Lediglich von Werten über 180 darfst du etwas subtrahieren. Und dann nicht 180 sondern 360.

Es scheint dir hier ja lediglich um Yaw zu gehen. Nimmt man dann nicht als erstes x und dann z bei atan2?

Rein theoretisch könntest du das aber auch über DeltaYaw lösen. Und für den kürzesten Turn-Winkel hatte ich mir vor Ewigkeiten mal einen code geschrieben, wer weiß, ob das nicht einfacher gegangen wäre.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Bura.Tino

BeitragMo, Aug 20, 2007 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora
Sorry. Smile

@StepTiger
Deltayaw hatte ich ja völlig vergessen. OMG... Rolling Eyes
Ich glaube der Befehl macht genau das, was ich wollte. Ich versuchs mal und geb Euch dann Bescheid.

/Edit:
Ich Dussel. Embarassed
Deltayaw bringt mir tatsächlich perfekterweise ein gewünschtes Ergebnis zwischen -180° und +180°.
Danke StepTiger für den Denkanstoß !

Aber wie kann man das mathematisch lösen ? Also was steckt hinter diesem Befehl ?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

StepTiger

BeitragDi, Aug 21, 2007 3:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, es wird der Winkel zwischen beiden herausgefunden. Mehr nicht ^^

Ich hab es aber oben schon geschrieben:
Atan2 um den winkel herauszufinden, dann über deinen winkel drüber rechnen.
Moment, ich suche mal schnell, glaube, ich hab da noch was... WIP

*edit*
So fertig! Hab's doch noch!
Also, um es zu erklären: Der erste Winkel ist der derzeitige Winkel. Der zweite ist der Zielwinkel. Der Code rechnet einfach nur Ziel gegen derzeitigen Winkel.
Der Code ist allerdings schon knapp 2 Jahre alt. Wer weiß, ob das nicht einfacher geht. Also, fangen wir mal an:

Code: [AUSKLAPPEN]
w1#=130
w2#=90

Print shortwink#(w1#,w2#)

WaitKey
End

Function shortwink#(src#,dest#)
   
   src#=src# Mod 360
   dest#=dest# Mod 360
   
   wert#=dest#-src#
   
   If wert#>180 Then wert#=-360+wert#
   If wert#<-180 Then wert#=360-Abs(wert#)
   
   Return wert#
   
End Function
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Bura.Tino

BeitragDi, Aug 21, 2007 4:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub, daß ist nicht ganz das was ich meine, weil ich ja den Zielwinkel nicht kenne, sondern nur den Winkel zwischen den Objekten.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

Dreamora

BeitragDi, Aug 21, 2007 10:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wo ist der Unterschied? Smile
Ich hab die Vermutung du bist da mit deinen Gedanken festgefahren in einer Vorstellung ... die es eigentlich garnicht gibt noch braucht Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Bura.Tino

BeitragDi, Aug 21, 2007 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wäre möglich. Wahrscheinlich hab ich einfach schon zuviel drüber nachgedacht. Wenn ich in zwei Wochen oder so nochmal drüber nachdenke wirds mir wahrscheinlich völlig klar sein. Aber manchmal íst es eben so, daß man probiert und probiert und irgendwann denn Wald vor lauter Bäumen nicht mehr sieht. *gg*
Aber is auch egal. Deltayaw funktioniert ja und somit is ja alles im grünen Bereich. Smile
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group