Bewegungsrichtung aus Winkel berechnen...

Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Nexhmije

Betreff: Bewegungsrichtung aus Winkel berechnen...

BeitragMi, Jun 11, 2008 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Nachdem ich mein anderes Projekt RaiseIt vor dem Release mal durchtesten und ein bisschen ruhen lassen wollte, hab ich mich ans Proggen eines neuen kleinen Projektes gesetzt.

In der Schule hab' ich beim Thema Trigonometrie und Freunde nicht gut aufgepasst, weswegen ich jetzt verzweifelt und selbstmordgefährdet bin, denn ich habe folgendes Problem:

Es werden zufallsgeneriert Objecte (Kreise) am Rand des Bildschirms erstellt. Diese sollen sich zur Mitte bewegen. Der Winkel ist (wenn auch komisch) immer richtig, nur hapert's bei der Berechnung, wo er sich denn nun hinbewegen soll.

Die entsprechenden Code-Teile:

Code: [AUSKLAPPEN]
Function GetAngle(X1, X2, Y1, Y2)
   If X2 > X1 And Y2 < Y1 Then
      Return ASin(Abs(X1-X2) / Sqr((Y1-Y2)^2 + (X1-X2)^2))
   ElseIf X2 < X1 And Y2 > Y1 Then
      Return ASin(Abs(X1-X2) / Sqr((Y1-Y2)^2 + (X1-X2)^2)) + 180
   ElseIf X2 > X1 And Y2 > Y1 Then
      Return 180 - ACos(Abs(Y1-Y2) / Sqr((Y1-Y2)^2 + (X1-X2)^2))
   ElseIf X2 < X1 And Y2 < Y1 Then
      Return 180 - ACos(Abs(Y1-Y2) / Sqr((Y1-Y2)^2 + (X1-X2)^2)) + 180
   EndIf
EndFunction


und

Code: [AUSKLAPPEN]
      Self.X = Self.X - (Sin(GetAngle(400, Self.X+8, 300, Self.Y+8)) * 1)
      Self.Y = Self.Y + (Cos(GetAngle(400, Self.X+8, 300, Self.Y+8)) * 1)


Beobachten konnte ich, dass sich die Objecte richtig bewegen, wenn sie sich rechts von der Bildschirmmitte befinden. Kommen sie von links bewegen sie sich (immer langsamer) bis auf die Höhe der Bildschirmmitte und dann schrittweise (10 Pixel - Pause, 10 Pixel - Pause...) zur Mitte hin.

Ich habe das Internet durchsucht und auch hier im Forum rumgekuckt, aber das verwirrt mich alles einfach immer mehr.

Ach, die Winkelberechnung stimmt wirklich. jedenfalls ist 3 Uhr 90 Grad, 6 Uhr 180 Grad und 9 Uhr 270 Grad.

Bin für jede Hilfe dankbar <3
 

BB-Fan

BeitragDo, Jun 12, 2008 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau das versuche ich auch.
Sozusagen PointEntity nachzubauen.

Bei dir wäre es das gleiche, nur das bei dir nach drehung noch ein move dazukommt, naja vielleicht bekommen wir es ja beide hin.

D2006

Administrator

Betreff: Re: Bewegungsrichtung aus Winkel berechnen...

BeitragDo, Jun 12, 2008 8:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Nexhmije hat Folgendes geschrieben:
Ach, die Winkelberechnung stimmt wirklich. jedenfalls ist 3 Uhr 90 Grad, 6 Uhr 180 Grad und 9 Uhr 270 Grad.


Sie stimmt nicht. Korrekt wäre das hier:
Code: [AUSKLAPPEN]
x = x + cos(winkel)
y = y - sin(winkel)


Aber zu deinem Problem: Schau dir mal den Befehl ATan2 an.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

BB-Fan

BeitragDo, Jun 12, 2008 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
was ist der untschied zu ATAN?

Smily

BeitragDo, Jun 12, 2008 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Steht in der Hilfe:

ATan liefert den Winkel zu einem Tangens-wert
ATan2 für sinus und cosinus
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

Dreamora

BeitragDo, Jun 12, 2008 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Man sollte schon was davon verstehen wenn man ne antwort gibt.

ATan und Atan2 machen prinzipiell das gleiche, haben aber einige gravierende Unterschiede:

1. ATan2 arbeitet mit y und x differenz getrennt, während ATan direkt mit ydiff / xdiff arbeitet
2. Atan kann aufgrund des Verhaltens keine eindeutigen Entscheidungen treffen. Denn Atan für Atan ist 0 - 90 das gleiche wie 180-270 bzw. -90 - -180 weil - / - = + wie auch + / +
ATan2 hingegen kann aus -ydiff und -xdiff den korrekten wert bestimmen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BB-Fan

BeitragDo, Jun 12, 2008 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
müsste aber trotzdem irgendwie nur mit ATAN gehen, oder?

Hab hier auch noch einen ältere programmiersprache rumliegen und wollte sowas mit ATAN berechnen, da es ATAN2 nicht gibt.
 

Dreamora

BeitragDo, Jun 12, 2008 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du es selbst machst dann ja.

Das heisst, du musst Atan berechnen von ydiff / xdiff und dann entsprechend der Vorzeichen noch +- einem wert rechnen, abhängig davon ob du winkel von 0 - 360 willst oder - 180 - 180
Denn ATan wird dir immer Winkel von -90 bis 90 geben.

XDiff Vorzeichen / YDiff Vorzeichen / Summand der addiert werden muss

0-360:
+ / + / 0
- / + / +180
- / - / +270
+ / - / +360

-180 - 180:
+ / + / - 180
- / + / 0
- / - / 0
+ / - / +180
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BB-Fan

BeitragDo, Jun 12, 2008 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
0-360:
+ / + / 0
- / + / +180
- / - / +270
+ / - / +360


das verstehe ich leider nicht, kann aber auch an der darstellung liegen.
 

Dreamora

BeitragDo, Jun 12, 2008 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Da fehlt auch die erste Zeile drüber, die die 3 Teile erklärt.

In Code würde etwas in der art von folgendem bedeuten

Code: [AUSKLAPPEN]

function GetAtan0To360#(xdiff#, ydiff#)
 if xdiff = 0 then xdiff = 1
 angle = atan(ydiff/xdiff)
 if xdiff>= 0
  if ydiff< 0
   angle = angle + 360
  endif
 else
  if ydiff>= 0
   angle = angle + 180
  else
   angle = angle + 270
  endif
 endif
 return angle
end function



Hier ma mit Komplettbeispiel um den Unterschied auch zu sehen:

Code: [AUSKLAPPEN]

For winkel = 0 To 360 Step 15
   tangens = Tan(winkel)
   Print "Winkel: " + Winkel + ", Tangens: " + tangens + " und ATan: " + ATan(tangens)
   Print "Mein Resultat: " + GetAtan0To360( Cos(winkel), Sin(winkel) )
   Delay 1000
Next


Delay 5000



End

Function GetAtan0To360#(xdiff#, ydiff#)

 If xdiff = 0 Then xdiff = 1
 angle = ATan(ydiff/xdiff)
 If xdiff>= 0
  If ydiff< 0
   angle = angle + 360
  EndIf
 Else
  If ydiff>= 0
   angle = angle + 180
  Else
   angle = angle + 270
  EndIf
 EndIf
 Return angle
End Function
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Do, Jun 12, 2008 14:31, insgesamt 2-mal bearbeitet
 

BB-Fan

BeitragDo, Jun 12, 2008 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
okay ich habs zwar noch nicht so ganz verstanden, aber vielleicht steig ich noch völlig dahinter.

danke dir.
  • Zuletzt bearbeitet von BB-Fan am Do, Jun 12, 2008 13:36, insgesamt 2-mal bearbeitet
 

Dreamora

BeitragDo, Jun 12, 2008 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Am einfachsten zeichnest du dir den Einheitskreis auf und legst das X, Y Achsen system durchs zentrum und schaust dir die 4 Sektoren an. Denen entsprechen die + - Kombinationen oben nämlich. 0 Grad beim Winkel ist übrigens auf der X Achse in +X Richtung
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BB-Fan

BeitragDo, Jun 12, 2008 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
in einem anderen thread versucht ich sozusagen PointEntity nachzubauen.
Ich habe aber in dem Basic Dialekt nur ebenso ATAN, wie müsste dann so eine Formel aussehen, wenn man von zwei Punkten im Raum nur jeweils xyz Koordinaten hat, und ObjektA nach ObjektB drehen möchte mittels Rotate bspw. und dazu pitch und yaw benötigt.

wärst ein schatz, wenn du mir da bei der formel helfen kannst, da ich da nur winkel=ATAN(dy#, dx#) habe, mehr nicht.
 

Dreamora

BeitragDo, Jun 12, 2008 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Je nach Sprache brauchst du den Workaround net.
In Blitz3D/Plus und BM brauchst du ihn auch net. in Blitz kann man Atan2 nehmen.

In anderen Sprachen setzt du einfach Winkel = atan(dy/dx)
Wenn das falsch raus kommt bzw. wie in Blitz hast du ja weiter oben in meinem Code die funktionierende Lösung. Einfach in die Sprache portieren wo du es brauchst und gut ist.

Wenn weder noch geht: Kümmer dich um dein Wissensdefizit und Lern Trigonometrie. Wirst es so oder so lernen müssen über kurz oder lang wenn du irgend etwas gescheites willst machen können in 2D und vor allem 3D. Vektormathe und Trigonometrie sind Grundvoraussetzungen, nicht "nice to have". Wers net kann ist ein Anfänger, nicht "zu wenig matheinteressiert".
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BB-Fan

BeitragDo, Jun 12, 2008 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaub ich hab das bei mir doch alles richtig gemacht, und die z rotation spinnt, was aber nicht an meinen formeln liegt, danke dir trotzdem sehr.

ich werd mich mal um trigonometrie und vektoren kümmern, hoffe ich finde was verständliches im netz.

vektoren gabs bei mir damals nicht, und trigonometrie, da bin ich mehr als 10 jahre raus, und bis auf einfache sachen, nie wieder gebraucht.
 

Dreamora

BeitragDo, Jun 12, 2008 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Netz sei dank sind solche Dinge heutzutage sehr einfach zu finden im Netz. Glaube zu Math im Vektormathe / Trigo Bereich hats sogar einige Links vermerkt.


Wie sind die Axen ausgerichtet? Z ist normalerweise ja die Axis in die Tiefe des Bildschirms (oder raus bei OpenGL) und um die rotiert man normalerweise nicht bei PointEntity weil das gerne Mal Probleme gibt.

Allgemein: Für PointEntity wo man am Schluss Richtung festlegen will und wo das "oben" sein soll, nutzt man besser Quaternionen, nicht Vektoren. Quaternionen können das
1. Eindeutig darstellen
2. Leiden sie nicht an Gimbal Lock (wenn man genau gerade nach oben oder unten schaut, kannst du jegliche rotation vergessen mit Matrizen oder 3 Winkeln weil der Zustand unendlich gross ist in beiden Repräsentationen)
3. Quaternionen erlauben es den übergang auch noch relativ billig zu lösen dank der Lerp Operation.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BB-Fan

BeitragDo, Jun 12, 2008 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Das weißt ich, ich mach das sagen wir mal mit rotateentity, pitch, yaw, 0

egal was bei pitch und yaw rauskommt, es rotiert immer um Z.

Z ist die tiefe, das weiß ich.

es dreht sich um die eigene achse, sichtbar ist es, dass es aussieht, als wäre die camera an einem propeller angebracht, in der mitte natürlich.

deshalb denke ich, etwas stimmt mit der rotation der z achse nicht.

[edit] was zum henker sind Quaternionen und wie nutzt man sowas?okay hab die wiki befragt, aber mmmm schwer.kann man darauf basierend so ein pointentity nachbauen?
 

Dreamora

BeitragDo, Jun 12, 2008 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Von welcher Engine reden wir genau?
Denn was auch sein könnte ist:

1. Deine Rotation wird in lokalen Koordinaten statt globalen gemacht
2. Deine berechnungen arbeiten nicht mit den globalen koordinaten der beiden entities
3. Wenn du was eigenes programmierst hast, kann es sein das die reihenfolge in welcher die rotationen angewendet werden "falsch" ist.
4. Wie stellst du fest, das es "scheinbar um die Z achse ist"? Normalerweise nutzt ich dafür eine pyramide mit einem 3eck als basis wobei der spitz in richtung der Z achse schaut und eine der Grundflächen Ecken gerade nach oben während die gegenseite parallel zu X achse ist. Also so das wenn man in z richtung schaut nur 1 Dreieck sieht das nach oben zeigt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BB-Fan

BeitragDo, Jun 12, 2008 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe auch ein moveentity drin, und da stimmt bewegung in z achse, daher meine schlussfolgerung.

ich schreibs mal ansatzweise für bb um,


Code: [AUSKLAPPEN]
FUNCTION EPointTo: handle, target
LOCAL x,y,z,xdiff,ydiff,zdiff,xangle,yangle,dist

    x = EntityX(target)    //
    y = EntityY(target)    // Koordinaten target Entity
    z = EntityZ(target)   //

    xdiff = EntityX(handle)-x //
    ydiff = EntityY(handle)-y // Entfernungen
    zdiff = EntityZ(handle)-z //

    dist=SQR((xdiff*xdiff)+(zdiff*zdiff))
    xangle=MOD((ATAN(ydiff,dist)+360),360)
    yangle=MOD((ATAN(xdiff,zdiff)+360),360)

    EntityRotate(handle, xangle, yangle, 0)

ENDFUNCTION


was sagst du dazu, hoffe es ist verständlich.
 

Dreamora

BeitragDo, Jun 12, 2008 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
und wo genau ist jetzt da die Funktion die ich oben geschrieben habe?

und EntityX etc würde, wenn das wirklich Blitz3D wäre, nicht funktionieren. da fehlt überall ,1 für "global"

darüber hinaus sind deine differenzen falsch. Vektor von "uns" zum Ziel ist immer ZielPosition - UnserePosition
Du hingegen machst es umgekehrt, das heisst es wird dich so drehen, das du mit dem rücken zum gegner sehen wirst vermutlich.

Was das Ding mit dem Dist soll ist mir ein Rätsel, beim besten willen. kick die zeile mal und rotier nur um y. Würde zu 99.5% sagen, dass der fehler einzig und allein von der x rotation kommt und von der berechnung + dem fehler den ich oben erwähnt hab.

kannst sonst auch direkt den BM code posten. sofern die namen sinnig gewählt sind stellt das kein problem dar für mich.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group