Winkel und andere Katastrophen... (Erledigt !)
Übersicht

![]() |
Bura.TinoBetreff: Winkel und andere Katastrophen... (Erledigt !) |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() ![]() |
- Zuletzt bearbeitet von Bura.Tino am Mo, Aug 27, 2007 6:44, insgesamt 2-mal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja...Das is so einfach nicht zu beantworten, weil die Werte völlig komisch sind. | ||
![]() ![]() |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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. |
||
![]() ![]() |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
![]() ![]() |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok. Hier der Code:
(sp=Starres Objekt; bp=Bewegbares Objekt) Code: [AUSKLAPPEN] Winkel=ATan2(BPZ-SPZ,BPX-SPX) Winkel2=Winkel-EntityYaw(BP)+90 |
||
![]() ![]() |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Sorry. ![]() @StepTiger Deltayaw hatte ich ja völlig vergessen. OMG... ![]() Ich glaube der Befehl macht genau das, was ich wollte. Ich versuchs mal und geb Euch dann Bescheid. /Edit: Ich Dussel. ![]() 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 ? |
||
![]() ![]() |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaub, daß ist nicht ganz das was ich meine, weil ich ja den Zielwinkel nicht kenne, sondern nur den Winkel zwischen den Objekten. | ||
![]() ![]() |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und wo ist der Unterschied? ![]() Ich hab die Vermutung du bist da mit deinen Gedanken festgefahren in einer Vorstellung ... die es eigentlich garnicht gibt noch braucht ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
![]() ![]() |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group