Objekt auf Kreisbahn bewegen

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
The Dust
Beiträge: 16
Registriert: Mi Jul 30, 2008 7:58 pm

Objekt auf Kreisbahn bewegen

Beitrag von The Dust » Mi Jul 30, 2008 8:00 pm

Hi, arbeitete grade an einem Spiel im 3D Gamestudio. Ich will ein Objekt mit Hilfe der Pfeiltasten bewegen. Das Objekt sollte sich, wenn man rechts drückt nach rechts auf einer Kreisbahn drehen (das gleiche mit links). Um das Objekt zu bewegen verwende ich "player_speed.x" und player_speed.y".
Ein Beispiel:

player_speed.x = 5; player_speed.y = 0; Das Objekt bewegt sich in Richtung x mit der Geschwindigkeit 5(dass muss wegen der Physik so gemacht werden...). Ich kann diese zwei Werte auch negativ setzen um jeden Punkt zu erreichen. Wie würde der Code aussehen der das Objekt auf einer Kreisbahn, sagen wir nach rechts, bewegen lässt ? Ich vermute das könnte man in einer Schleife machen oder ? Die Sprache die ich im Gamestudio verwende ist mehr oder weniger C. Ich bedanke mich schon mal auf eine hoffentlich simple Lösung :)

Edit by Xin: Titel geändert, Originaltitel "Kleine Aufgabe für alle :)"

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kleine Aufgabe für alle :)

Beitrag von nufan » Mi Jul 30, 2008 8:03 pm

Ich weiß jetzt nicht genau, was du wissen willst. Wie man Pfeiltasten einliest, hab ich in einem anderen Thread hier in C/C++ beschrieben (begrenzte Zeit für Eingabe).

The Dust
Beiträge: 16
Registriert: Mi Jul 30, 2008 7:58 pm

Re: Kleine Aufgabe für alle :)

Beitrag von The Dust » Mi Jul 30, 2008 8:05 pm

Also die Kernfrage ist nicht wie man die Tastatur einließt sondern wie der Code aussehen sollte damit mein Objekt Kreisbögen macht :lol:

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Kleine Aufgabe für alle :)

Beitrag von Xin » Mi Jul 30, 2008 8:33 pm

The Dust hat geschrieben:Wie würde der Code aussehen der das Objekt auf einer Kreisbahn, sagen wir nach rechts, bewegen lässt ? Ich vermute das könnte man in einer Schleife machen oder ? Die Sprache die ich im Gamestudio verwende ist mehr oder weniger C. Ich bedanke mich schon mal auf eine hoffentlich simple Lösung :)
Ich gehe davon aus, dass sich das 'Raumschiff' oder was auch immer oben befindet und wenn ich nach Rechts drücke, bewegt es sich nach rechts, dann runter, dann unten nach links und wieder hoch...?

Du bist im 2 dimensionalen Raum, das schreit nach Vektoren.
Ansonsten willkommen bei den Trigeometrischen Funktionen: sinus und cosinus.

Mit rechts erhöhst Du den Winkel α, mit links verkleinerst Du ihn und damit berechnest Du die x und y Koordinaten:
x = l * sin( α ), y = l * cos( α );

Herzlich willkommen in der 7. Klasse ;-)

Das wäre die Schulmathematik, vielliecht lohnt sich auch ein Blick auf den Bresenham-Algorithmus?

Was genau ist das 'GameStudio 3D'?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Kleine Aufgabe für alle :)

Beitrag von fat-lobyte » Mi Jul 30, 2008 8:37 pm

Hast du schon mal was vom "Sinus" und vom "Cosinus" gehört? Oder von "Winkelgeschwindigkeit"?
Ich denke wenn du die Begriffe nachschlägst wirst du deine Lösung selbst finden.

Ein heißer Tipp: Wenn du es mit Physik zu tun hast, schreibe immer die Einheiten dazu. Das hilft sehr sehr viel beim Denken. Welche Einheit hat player_speed.x? Meter? Pixel? Lichtjahre?
Wenn das Objekt sich im Kreis dreht, welche Einheit hat dann die geschwindigkeit? m/s? oder °/s ?
All das wird dir helfen.

Ich glaube für die Kreisbewegung um einen Punkt bräuchtest du eine sogenannte "Rotationsmatrize". Die müsstest du mit den richtigen Werten Initialisieren, und dann mit deiner Positionsmatrize (also wo die Objekte gerade sind) multiplizieren. Aber ich denke, da kann dir Kerli besser weiterhelfen.

Übrigens: bitte ändere das Thema in etwas passenderes, wie "Objekt auf Kreisbahn bewegen" oder so was, "Kleine Aufgabe für alle :)" ist auf jeden fall nicht passend. Falls du es nicht mehr kannst, dann mach ich das für dich.
Haters gonna hate, potatoes gonna potate.

The Dust
Beiträge: 16
Registriert: Mi Jul 30, 2008 7:58 pm

Re: Kleine Aufgabe für alle :)

Beitrag von The Dust » Mi Jul 30, 2008 10:19 pm

Danke schon mal für die eingehenden Antworten.
@Xin
Es handelt sich bei mir eigentlich um einen 3D Raum. Mit den Tasten "rechts" "links" kreist der Player mit einem bestimmten Radius um die Kamera, die immer zum Player schaut und ihm folgt. Mit "rauf" und "runter" bewegt sich der Player immer in die Richtung in die man gerade schaut (das wird übrigends die zweite happige Sache die ich in dem Zusammenhang machen muss). Diese Art den Player und die Kamera bewegen zu lassen habe ich mir (nach vielen gescheiterten Selbstversuchen) bei den "großen" abgeschaut (GTA und Super Mario :mrgreen: ). x = l * sin( α ), y = l * cos( α ); scheint zu funktionieren, muss noch damit länger experimentieren ;)
Das 3D Gamestudio ist ein Hilfsmittel, dass das Spiele entwickelen (wenn man es so nennen mag) für mich erst möglich macht. Es ist eine Engine und ein Welt-Editor in dem ich die ganzen Modelle und den Code zusammentrage. Wäre ich ein spitzen Programmierer würde ich sagen, es wäre unflexibel, da dass aber nicht der Fall ist, bemerke ich keine direkte Einschränkung. Wenn ich die bemerke weiß ich, dass ich das Programm voll ausgenutzt habe :mrgreen: .

@fat-lobyte
Dass werde ich im heurigen Schuljahr alles besser kennen lernen.... ;)
Ja, ein paar Einheiten wären sicher gut für die Übersicht :mrgreen:
Achja, ändere bitte den Titel in deinen Vorschlag um, ich sehe keinen Editier-Button. Hatte vorher so eine kreative Phase sorry :lol:
Zuletzt geändert von The Dust am Mi Jul 30, 2008 10:35 pm, insgesamt 1-mal geändert.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Objekt auf Kreisbahn bewegen

Beitrag von Kerli » Mi Jul 30, 2008 10:27 pm

The Dust hat geschrieben:Hi, arbeitete grade an einem Spiel im 3D Gamestudio. Ich will ein Objekt mit Hilfe der Pfeiltasten bewegen. Das Objekt sollte sich, wenn man rechts drückt nach rechts auf einer Kreisbahn drehen (das gleiche mit links). Um das Objekt zu bewegen verwende ich "player_speed.x" und player_speed.y".
So wie das ausschaut, würde ich einmal vermuten, dass die ganze Bewegung der Objekte direkt von der Engine übernommen wird. Deshalb wird es wahrscheinlich auch nicht möglich sein mit einer Rotationsmatrix zu arbeiten.
Da es aber wahrscheinlich eine Schleife gibt, die in jedem Renderdurchgang einmal aufgerufen wird, kannst du dort dir Bewegung jedesmal so anpassen, dass die Bewegungsrichtung immer in Richtung der Kreisbahn schaut bzw. normal auf den Radius vom Kreismittelpunkt zum Objekt.
D.h. du bildest einfach in jedem Schleifendurchlauf den Vektor vom gewünschten Kreismittelpunkt zum Objekt. Bildest dann den dazu normalen Vektor normalisierst diesen und multiplizierst ihn anschließend mit der (Winkel-)Geschwindigkeit des Objekts. Jetzt musst du nur noch "player_speed.x" und "player_speed.y" auf die Werte des errechneten Vektors setzen und schon bewegt sich dein Objekt auf einer schönen Kreisbahn ;)
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Objekt auf Kreisbahn bewegen

Beitrag von Dirty Oerti » Do Jul 31, 2008 1:14 pm

Hi, arbeitete grade an einem Spiel im 3D Gamestudio. Ich will ein Objekt mit Hilfe der Pfeiltasten bewegen. Das Objekt sollte sich, wenn man rechts drückt nach rechts auf einer Kreisbahn drehen (das gleiche mit links). Um das Objekt zu bewegen verwende ich "player_speed.x" und player_speed.y".
Ah...3D Gamestudio...ja, das waren noch Zeiten^^ :) Habe meine "alte" Sybex-CD (leider Sybex..) mit A6 Extra noch hier rumliegen...

Dein Problem ist, wie schon geschrieben, recht einfach zu lösen.
Vergiss "Rotationsmatrixen" oder so...

Du hast deine X-Position und deine Y-Position.
Und einen Kreis. Natürlich mit einem gewissen Radius.

Nehmen wir an, die Kreismitte ist X=0 und Y=0.

Deine Position "ganz rechts auf dem Kreis" wäre in Koordinaten ausgedrückt X=Radius und Y=0.
Die Position "ganz oben auf dem Kreis" wäre X=0 und Y=Radius.

Um darauf zu kommen und auch auf die Position dazwischen brauchst du sin und cos.
Um das genauer zu verstehen rate ich dir, in Google mal "Einheitskreis" einzugeben.

Die X-Position bestimmst du demnach so:
X = Radius * cos(Winkel)
Die Y-Position ergibt sich aus:
Y= Radius * sin(Winkel)

Um deine Position nun zu verändern, änderst du einfach die Variable "Winkel".
Je nachdem, ob die Winkel im oder gegen den Uhrzeigersinn gemessen werden (weiß ich nicht mehr genau) addierst bzw subtrahierst du einen Wert von Winkel, wenn eine der beiden Steuertasten gedrückt wurde.

Je größer der Wert, desto schneller die Bewegung.
Wählst du den Wert aber zu groß, dann sieht die Bewegung ruckelig aus.

Wenn du willst kann ich mal in meinem alten Code für Gamestudio ein bisschen suchen. Da hab ich noch n paar Sachen...also solltest du was brauchen.

Mal ne Frage:
Welche Version hast du? Ist deine Version schon mit C-lite ?

Das 3D Gamestudio ist ein Hilfsmittel, dass das Spiele entwickelen (wenn man es so nennen mag) für mich erst möglich macht. Es ist eine Engine und ein Welt-Editor in dem ich die ganzen Modelle und den Code zusammentrage. Wäre ich ein spitzen Programmierer würde ich sagen, es wäre unflexibel, da dass aber nicht der Fall ist, bemerke ich keine direkte Einschränkung. Wenn ich die bemerke weiß ich, dass ich das Programm voll ausgenutzt habe :mrgreen: .
3D Gamestudi grenzt dich arg ein.
Dazu nur:
*keine Pointer bzw flexible Speicherallozierung
*überhaupt keine unterschiedlichen Variablentypen (außer "var" und "string", zumindest in meiner Version mit C-Skript)
*auch ansonsten wenig Kontrolle darüber, was vor sich geht.

Außerdem wirst du mit 3D Gamestudio nicht richtig programmieren lernen können.
Es ganz gut für den Anfang, aber auf lange Sicht solltest du schon auf C oder C++ umsteigen.
Je nach dem, was du programmieren willst natürlich.
Allerdings, was dich bei einem Wechsel evtl erstmal umhauen wird ist, das eine While-Schleife, die endlos abläuft, in einem 3D Gamestudioprogramm kein Problem, sondern sogar normal ist. In einem C/C++ Programm allerdings...hängt das dein komplettes Programm auf...

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Objekt auf Kreisbahn bewegen

Beitrag von Kerli » Do Jul 31, 2008 1:26 pm

Dirty Oerti hat geschrieben:Vergiss "Rotationsmatrixen" oder so...
Weil das jetzt schon öfters vorgekommen ist. Die Einzahl ist "Matrix" und die Mehrzahl "Matrizen". Das nur so am Rand ;)
Dirty Oerti hat geschrieben:Allerdings, was dich bei einem Wechsel evtl erstmal umhauen wird ist, das eine While-Schleife, die endlos abläuft, in einem 3D Gamestudioprogramm kein Problem, sondern sogar normal ist. In einem C/C++ Programm allerdings...hängt das dein komplettes Programm auf...
Das hängt davon ab, was du machst. Wenn ich mit OpenGL nur ein Bild rendern würde, dann wird daraus nie ein Spiel werden :D
Dazu brauch ich auch eine Endlosschleife...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Objekt auf Kreisbahn bewegen

Beitrag von Dirty Oerti » Do Jul 31, 2008 1:40 pm

Kerli hat geschrieben:Das hängt davon ab, was du machst. Wenn ich mit OpenGL nur ein Bild rendern würde, dann wird daraus nie ein Spiel werden :D
Dazu brauch ich auch eine Endlosschleife...
Was ich damit sagen wollte:
In 3D Gamestudio werden Funktionen von sich aus schon parallel laufen gelassen.
Das heißt du programmierst für jedes Objekt eine eigene Funktion (dort "action" genannt), die eine Endlosschleife drinn hat (zum Beispiel das Feuer, das andauernd flackert). Dann laufen all die Funktionen parallel ab (bzw quasi-parallel).

In C/C++ kannst du so etwas wohl nur durch Threads erreichen...
Die Einzahl ist "Matrix" und die Mehrzahl "Matrizen".
Hupps^^ Ist mir bekannt...
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten