gleichmäßige Bewegung bei Waypoints

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

 

Cedric30003

Betreff: gleichmäßige Bewegung bei Waypoints

BeitragMi, Apr 20, 2011 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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:

user posted image

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

BeitragMi, Apr 20, 2011 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 20, 2011 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist jetzt nur eben aus meinem Codearchiv kopiert, aber das Prinzip geht schön daraus hervor, denke ich.

BlitzBasic: [AUSKLAPPEN]
Graphics 640,480 
SetBuffer BackBuffer()

;PunktKoords
px#=320
py#=240
;ZielKoords
mx=-10
my=-10
;Geschwindigkeit
speed=2


go=0

While Not KeyHit(1)
If MouseHit(1)Then
mx=MouseX()
my=MouseY()
w#=(ATan2((mx-px#),(my-py#))+270) Mod 360
GO=1
End If
If go=1 Then
px#=px#+speed*Cos(w#)
py#=py#+speed*-Sin(w#)
If Abs(mx-px)<=speed And Abs(my-py)<=speed Then go=0
End If
Cls
;Maus
Color 0,0,$FFFFFF
Rect MouseX(),MouseY(),5,5
;Punkt
Color 0,0,$FF0000
Rect px,py,5,5
;Ziel
Color 0,0,$00FFFF
Rect MX,MY,5,5
Flip
Wend

End
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Cedric30003

BeitragMi, Apr 20, 2011 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 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

BeitragMi, Apr 20, 2011 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 20, 2011 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 20, 2011 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 20, 2011 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter

Xeres

Moderator

BeitragMi, Apr 20, 2011 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Dottakopf

BeitragMi, Apr 20, 2011 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin ich jetzt doof oder kann man das nicht ganz simpel mit

AligntoVector oder mit Pointentity regeln ??


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

BladeRunner

Moderator

BeitragDo, Apr 21, 2011 9:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 21, 2011 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
(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

BeitragDo, Apr 21, 2011 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Schauen welche Wege wie lang sind und am Ende einfach den kürzesten Weg wählen und deinem Obejkt als Pfad zuweisen.
 

Cedric30003

BeitragDi, Apr 26, 2011 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 27, 2011 2:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragMi, Apr 27, 2011 6:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 27, 2011 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 27, 2011 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versuche nochmal auf deinen Ersten Beitrag einzugehen:

Arrow Du versuchst Waypoints zu erstellen um irgendein Objekt von A nach B über diese Punkte zu bewegen
Arrow Wir befinden uns im 3D Bereich
Arrow 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...


Arrow Erstelle mithilfe von Types Waypoints
Arrow Jeder Waypoint braucht eine ID und seine Position(x,y,z) als Feld
Arrow 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
Arrow Gehe alle Types durch und suche den Waypoint mit der ID=1
Arrow Richte dein Objekt, welches sich zu den WP bewegen soll mithilfe von aligentoVector bzw. mit Pointentity zu dem Waypoint aus
Arrow Bewege deine Objekt solagange in richtung waypoint bis distanz <= ...
Arrow 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!

BladeRunner

Moderator

BeitragMi, Apr 27, 2011 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 27, 2011 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group