Bewegungsrichtung aus Winkel berechnen...
Übersicht

![]() |
NexhmijeBetreff: Bewegungsrichtung aus Winkel berechnen... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
![]() |
D2006AdministratorBetreff: Re: Bewegungsrichtung aus Winkel berechnen... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
was ist der untschied zu ATAN? | ||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] 0-360:
+ / + / 0 - / + / +180 - / - / +270 + / - / +360 das verstehe ich leider nicht, kann aber auch an der darstellung liegen. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group