gleichmäßige Bewegung bei Waypoints
Übersicht BlitzBasic Beginners-Corner
Cedric30003Betreff: gleichmäßige Bewegung bei Waypoints |
Mi, Apr 20, 2011 22:31 Antworten mit Zitat |
|
---|---|---|
Hey Leute!
Ich beschäftige mich grade mit WayPoints. Nun, die Points an sich waren ja nicht schwer, aber wie bekomme ich es hin, dass von quasi WayPoint1 zu WayPoint2 eine genau diagonal Linie gezogen wird, und nicht so ein geknickter Firlefanz der "Weg ist"?? Ich hoffe dass das Bild mehr aussagt: Code: [AUSKLAPPEN] Graphics3D 800,600,32,2 SetBuffer BackBuffer() Global cam1=CreateCamera() PositionEntity cam1,0,5,-5 TurnEntity cam1,45,0,0 cube = CreateCube () PositionEntity cube,0,0,0 Global AW_x# = 0 ;Aktuellerwegpunkt [X] Global AW_y# = 0 ;Aktuellerwegpunkt [Y] Global AW_z# = 0 ;Aktuellerwegpunkt [Z] Global NW_x# = 0 ;Aktuellerwegpunkt [X] Global NW_y# = 0 ;Aktuellerwegpunkt [Y] Global NW_z# = 0 ;Aktuellerwegpunkt [Z] Global cubex# = 0 Global cubey# = 0 Global cubez# = 0 Global movespeed# = 0.00002 While Not KeyHit(1) ;das ist die Kamerasteuerung, welche auch immer wieder durchlaufen muss!!! Include "Kameraneu.bb" ;Vorwärts! MoveEntity cube,cubex,cubey,cubez If NW_x > AW_x Then cubex = cubex + movespeed# EndIf If NW_y > AW_y Then cubey = cubey+ movespeed# EndIf If NW_z > AW_z Then cubez = cubez + movespeed# EndIf If NW_x < AW_x Then cubex = 0 EndIf If NW_y < AW_y Then cubey = 0 EndIf If NW_z < AW_z Then cubez = 0 EndIf If KeyDown (200) Then X$= Input ("X: ") Y$= Input ("Y: ") Z$= Input ("Y: ") movespeed# = Input ("Speed: ") EndIf NW_x = X$ NW_y = Y$ NW_z = Z$ AW_x = AW_x + cubex AW_y = AW_y + cubey AW_z = AW_z + cubez Text 10,10,"AW_X" + AW_x Text 20,10,"AW_Y" + AW_y DebugLog NW_x UpdateWorld RenderWorld Flip Wend End Wie bekomm ich das gut hin, bzw, was muss gerechnet werden, damit da eine gescheite Bewegung rauskommt? Danke im Voraus MfG Cedric |
||
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB) |
- Zuletzt bearbeitet von Cedric30003 am Mi, Apr 27, 2011 19:21, insgesamt einmal bearbeitet
TimBo |
Mi, Apr 20, 2011 22:34 Antworten mit Zitat |
|
---|---|---|
warum ist die rote Linie gekrümmt? Liegt da der Waypoint 1.5 oder was?
Du lässt in der Skizze den Player von WP1 nach WP2 maschieren und jetzt? |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
Hubsi |
Mi, Apr 20, 2011 22:37 Antworten mit Zitat |
|
---|---|---|
Das ist jetzt nur eben aus meinem Codearchiv kopiert, aber das Prinzip geht schön daraus hervor, denke ich.
BlitzBasic: [AUSKLAPPEN] Graphics 640,480 |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Cedric30003 |
Mi, Apr 20, 2011 22:40 Antworten mit Zitat |
|
---|---|---|
@ TimBo: ja, weil der cube auf 2 achsen aufeinmal bewegt wird, und da der eine Weg auf der einen Achse kürzer ist, als der andere, prallt er dort quasi gegen die wand, unbd es geht geradeaus weiter, weil die andere Achse ja noch, nicht zu ende ist.
verstanden?? @Hubsi, ein kompletter Code, bringt mir gerade nciht ganz soviel, weil ich darin ncith alles verstehe, wäre es möglich, dass du das nochmal erklärst?? (BladeRunner meint ja auch, dass fertige Codes einem nciht viel bringen) Danke im Voraus MfG Cedric |
||
TimBo |
Mi, Apr 20, 2011 22:41 Antworten mit Zitat |
|
---|---|---|
jetzt weiß ich was du meinst...
du musst über die Winkel gehen. Hattest du in der Schule schon Sinus sin und Kosinus cos ? |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
Cedric30003 |
Mi, Apr 20, 2011 22:43 Antworten mit Zitat |
|
---|---|---|
Sorry, aber das sagt mir garnicht, war in der Schule ncoh nicht dran.
Könnte das jemand mal soweit erklären, dass ich das hinbekomme?? Danke im Voraus MfG Cedric |
||
TimBo |
Mi, Apr 20, 2011 22:48 Antworten mit Zitat |
|
---|---|---|
ich musste es mir damals auch selbst beibringen.
Also schau dir zuerst mal den Einheitenkreis an. Der ist das A und O. Du hast ein Objekt auf einer X und auf einer Y Kordinate und du hast einen Speed V und einen Winkel A dann gilt : Zitat: Xneu = X + cos(A)*v
Yneu = Y + sin(A)*v probiere dich mal mit den Formeln. Den Winkel bekommste mit atan2 das ist der Tangenz, hattest du demnach auch noch nicht in der Schule. Es gilt: Zitat: A = tangenz ( y1 - y2 / x1 - x2)
in B3D: A% = atan2( y1-y2 , x1-x2) Grüße TimBo |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
skey-z |
Mi, Apr 20, 2011 22:49 Antworten mit Zitat |
|
---|---|---|
schau dir mal die BPS Serie an, da war das in der 3 oder 4 Stufe dran | ||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
XeresModerator |
Mi, Apr 20, 2011 23:03 Antworten mit Zitat |
|
---|---|---|
Sofern es wirklich 3D ist, sieht das ganze aber noch etwas komplizierter aus:
Code: [AUSKLAPPEN] X = OrigX + Radius * Cos( Pitch ) * Cos( Yaw )
Y = OrigY + Radius * Sin( Yaw ) Z = OrigZ + Radius * Sin( Pitch ) * Cos( Yaw ) Original-Thread |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Dottakopf |
Mi, Apr 20, 2011 23:14 Antworten mit Zitat |
|
---|---|---|
Bin ich jetzt doof oder kann man das nicht ganz simpel mit
AligntoVector oder mit Pointentity regeln ?? Gruß Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
BladeRunnerModerator |
Do, Apr 21, 2011 9:06 Antworten mit Zitat |
|
---|---|---|
Man muss keinen Winkel kennen und braucht auch weder Sinus noch Cosinus um diese Aufgabe zu lösen.
Gegeben sind ein Start- und ein Endpunkt. Deren Distanz berechnet man (Satz des Pythagoras). Diese Distanz ist der Betrag des Vektors von Start zu Ziel. Nun teilt man die einzelnen Achsabstände durch eben diesen Betrag. (Also (x1-x2)/distanz und (y1-y2)/distanz). Damit erhält man den Einheitsvektor für diese Richtung. Diesen Einheitsvektor kann man nun mit einer beliebigen Länge (und damit Geschwindigkeit) versehen indem man die einzelnen Achsabschnitte mit eben dieser multipliziert. Nun musst Du nur noch in jedem Durchlauf die aktuelle Koordinate mit dem geschwindigkeitsangepassten Vektor addieren(also die X- und die y-Komponente) und dein Startpunkt bewegt sich auf deinen Zielpunkt zu. Noch Fragen? |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
TimBo |
Do, Apr 21, 2011 11:20 Antworten mit Zitat |
|
---|---|---|
(z1-z)/distanz fehlen noch oder ?
Edit: die Idee hatte ich auch , aber ich dachte die Vorgehensweise versagt irgendwie.. |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
Omenaton_2 |
Do, Apr 21, 2011 11:41 Antworten mit Zitat |
|
---|---|---|
Schauen welche Wege wie lang sind und am Ende einfach den kürzesten Weg wählen und deinem Obejkt als Pfad zuweisen. | ||
Cedric30003 |
Di, Apr 26, 2011 20:52 Antworten mit Zitat |
|
---|---|---|
Also, am logischten, und am einfachsten erscheint mir der Beitrag von BladeRunner, bloß welche Distanzen jetzt durcheinander geteilt und multipliziert werden müssen, verstehe ich gerade überhaupt nicht. Kann sein, dass cih nur eine Denksperre hab, aber wäre evt eine einfaches Beispiel, ohne Sin & Cos möglich? Am besten wäre dazu ncoh eine Erklärung, damit ich am Ende auch was davon habe, und den Code verstehe.
Danke im Voraus MfG Cedric |
||
TimBo |
Mi, Apr 27, 2011 2:19 Antworten mit Zitat |
|
---|---|---|
der logischte Beistrag ist meiner Meinung nach von Xeres...
das sollte ohne Probleme nachvollziehbar sein |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
BladeRunnerModerator |
Mi, Apr 27, 2011 6:15 Antworten mit Zitat |
|
---|---|---|
Vorneweg: Meine Antwort bezog sich auf 2D, lässt sich aber auf 3D erweitern.
Ich werde Dir keinen fertigen Code geben, aber mein Beispiel etwas deutlicher formulieren - der Rest ist dann deine Arbeit. Gehen wir von deinem Bild aus: Du hast da 2 Waypoints. Ich unterstelle jetzt einfach mal dass deine Waypoints in Types sind und 3 Koordinaten (x,y,z) haben. Distanz WP1-WP2: distanz = sqr((x2-x1)²+(y2-y1)²+(z2-z1)²) Erläuterung: Das ist der Pythagoras, auf den R³ angewendet. Distanz ist kein Vektor, sondern sein Betrag, also eine Größenangabe, bzw. auch als Länge des Vektors zu verstehen. Der Vektor den wir hier betrachten ist derjenige der entsteht wenn wir die Vektoren zu deinen einzelnen Waypoints voneinander abziehen, und damit bestimmen wir die Distanz. Einheitsvektor (Ebenfalls ein Type mit 3 Koodrinaten): EV\x = (x2-x1)/distanz EV\y = (y2-y1)/distanz EV\z = (z2-z1)/distanz Erläuterung: Distanz ist wie oben schon erwähnt ein Betrag, also eine Größenangabe. Indem wir nun den Vektor, dem wir diese Größe entnommen haben durch eben seine Größe teilen erhalten wir einen neuen Vektor mit einer besonderen Eigenschaft: sein Betrag ist 1. Damit kann man sehr schön mit ihm weiter vorgehen. Nun musst Du nur noch in jedem Frame den Einheitsvektor*Geschwindigkeit (nennen wir ihn Speed-Vektor) zu deinem WP1 addieren. (Also: Multiplizieren geht analog zur Bildung des Einheitsvektors, nur mit * statt /: Speed\x = ev\x *geschwindigkeit, Speed\y = ... , Addition zweier Vektoren heisst ihre x, y, und z-Werte einzeln zu addieren: x1+x2, y1+y2...) Erläuterung: Durch das Multiplizieren mit einem Geschwindigkeitswert geben wir dem Speedvektor eben genau die Länge die nötig ist um entsprechend der Geschwindigkeit Raum zu überbrücken. Man beachte dass es einem Vektor schnurz ist in welche Richtung er blickt, die Geschwindigkeit regeln wir rein über die Länge. Daher war es so praktisch den Einheitsvektor zu haben, denn nun haben wir eine definierte Länge erreichen können. Die Addition ist das Gegenteil zur Substraktion zweier Vektoren von vorhin. Ich ermittele also keine Distanz, sondern ich füge sie hinzu. Da ich zu WP1 den Speedvektor hinzufüge liegt er danach näher an WP2, was genau ist was wir erreichen wollten. Noch Fragen? |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
PhillipB |
Mi, Apr 27, 2011 11:46 Antworten mit Zitat |
|
---|---|---|
Also ich wäre auch so vorgegangen wie cedric.
Doch jetzt verstehe ich nurnoch sry aber Bahnhof! Und ich denke das es Cedric auch so geht! Wir wissen auch das wir noch viel lernen müssen. Natürlich bringt das nicht mit ganzen code senden aber ich glaube in diesemfalle schon. Da die Erläuterung für Anfänger ziemlich unverständlich ist. Mir z.B. würde ein lauffähiges Beispiel mit guter erklärung weiterhelfen bzw. besser helfen. Man kann ja auch an code lernen. mfg PhillipB. |
||
Dottakopf |
Mi, Apr 27, 2011 12:19 Antworten mit Zitat |
|
---|---|---|
Ich versuche nochmal auf deinen Ersten Beitrag einzugehen:
Du versuchst Waypoints zu erstellen um irgendein Objekt von A nach B über diese Punkte zu bewegen Wir befinden uns im 3D Bereich Du hast nicht verstanden was der Pythagoras macht..... Nun,... wie schaffe ich es jetzt dir eine Antwort zu presentieren die zum einen Bladerunner nicht in den Rücken fällt und zum anderen dich dazu bringt dein Gehirn etwas mehr anzustrengen... ...Ich weis es nicht. Aber ich weis wie man dein Problem lösen kann... Erstelle mithilfe von Types Waypoints Jeder Waypoint braucht eine ID und seine Position(x,y,z) als Feld Zudem braucht jeder Waypoint ein 3D handle. hierzu würde ich Pivots erstellen. bzw. zum üben können es einfach cubes sein. So ist die Theorie um ein Objekt von einem Waypoint zum nächsten zu bewegen Gehe alle Types durch und suche den Waypoint mit der ID=1 Richte dein Objekt, welches sich zu den WP bewegen soll mithilfe von aligentoVector bzw. mit Pointentity zu dem Waypoint aus Bewege deine Objekt solagange in richtung waypoint bis distanz <= ... Suche nun Waypoint mit der ID= 2 und beginne wieder mit dem Bewegen.... Die benötigten Wunderbefehle dafür sind: Pointentity oder AlignToVector Entitydistance Moveentity Schreibe einen kleinen Testaufbau.. mit Primitives ( Cubes,Sphere usw...) und versuche dort deine Problemstellung zu lösen. Erst dann versuche deine gelernte Technik in dein Projekt zu implementieren. Das ist ganz normal...Spart Zeit und Nerv.. und du hast lauffähigen code den man hier im Portal mal Posten kann. Bitte sieh dir den Pythagoras an. Das klingt alles super kompliziert, aber es ist erschreckend einfach wenn man es mal verstanden hat. Im 2D Bereich könnte man diese Aufgabenstellung nur wie von Blade beschrieben lösen. Gruß Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
BladeRunnerModerator |
Mi, Apr 27, 2011 18:37 Antworten mit Zitat |
|
---|---|---|
Da dreh ich den Schuh doch glatt mal rum:
Ich verstehe nicht was Du nicht verstehst, Phillip, da Du es mir auch leider nicht sagst. Ich bin gerne bereit Teilaspekte nochmal zu erläutern. Ich bin nicht bereit Dir Code zu liefern, zumal alles was für den Code benötigt wird in meinem Posting drin ist. Unabhängig davon ob Du / Ihr den Satz des Pythagoras in der Schule schon behandelt habt habe ich seine praktische Anwendung für den vorliegenden Fall schon explizit angegeben. Ich habe jeden einzelnen Schritt mathematisch korrekt vorgegeben, es liegt nur an dir diese Formeln in ein Programm zu packen. Und das ist auch das Minimum was ich von jemandem der programmieren möchte erwarte: dass er selbst ausprobiert wie etwas gehen könnte. Wenn Deine/Eure Versuche scheitern könnt ihr immerhin den von euch erwirtschafteten Code hier einstellen und man kann schauen wo der Fehler liegt. Aber ich werde keine fertige Lösung präsentieren, denn dann ist der Lerneffekt gering bis null. Wenn Du/ihr mir also gezielt aufzeigt wo was nicht klar ist, helfe ich gern. Damit zeigt ihr mir nämlich dass ihr euch ernsthaft um Verständnis bemüht. Edit: ansonsten empfehle ich google / wikipedia zu Satz des Pythagoras, Trigonometrie, Vektor(rechnung) |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Rainer Z |
Mi, Apr 27, 2011 18:59 Antworten mit Zitat |
|
---|---|---|
Ich verstehe - trotz googlen - den Satz des Pythagoras nicht.
Mit den dort aufgeführten Rechnungen komme ich einfach nicht klar, da sie mir zu hoch sind (7. Klasse) hatten wir noch nicht. Deswegen verstehe ich die ganze Rechnung dort auch nicht. Ich will garkeinen Code, ich hätte nur gerne gewusst, wie ich einfach, mit den Variablen der beiden achsen rechnen muss. Was mir helfen würde, wäre, wenn mir hier einmal eine Rechnung, mit Variablen der beiden Achsen, gezeigt wird. |
||
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group