Objekt erst drehen und dann bewegen
Übersicht

TheMagicianBetreff: Objekt erst drehen und dann bewegen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen,
ich habe ein Objekt das sich mit "PointEntity" und "MoveEntity" auf ein Zielobjekt zubewegt. Wenn das Objekt dort angekommen ist bleibt es stehen und der Spieler kann wieder irgendwo klicken und das Objekt bewegt sich wieder zum neuen Zielpunkt. Das fuktioniert schonmal. Ich würde jetzt jedoch gerne das Objekt erst langsam in die Richtung des Zielobjekts drehen lassen bevor es losfährt. Mit "PointEntity" springt die Orientierung des Objekts ja sofort in die neue Richtung (ohne Drehung). Kann mir da jemand helfen? Und noch eine kleine Frage: gibt es eigentlich eine Funktion die einen Wert zurückgibt ob sich ein bestimmtes Objekt gerade bewegt oder nicht? Vielen Dank im Vorraus, Stefan |
||
![]() |
Alfadur |
![]() Antworten mit Zitat ![]() |
---|---|---|
winkel zwischen den objekten berechnen, dann mit turnentity drehen... wenn sich ein objekt bewegt macht es das ja mit ner bestimmten geschwindigkeit, also ist sie 0 wenn es sich nicht bewegt... das kannste ja abfragen... | ||
A Cray is the only computer that runs an endless loop in less than four hours. |
TheMagician |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Tips Alfadur.
Exakt die gleichen Gedankengänge hatte ich auch schon. Nur als Blitz3D-Beginner fehlen mir die entsprechenden Funktionen die ich benötige. Leider bringt mir da die Blitz3D Hilfe auch nicht viel, weil man die ja nicht nach Schlüsselwörtern wie "object speed" oder so durchsuchen kann. Ich bin mir sicher, dass in der Hilfe Beispiel-Codes stehen aus denen ich mir die Lösung zsuammenreimen könnte. Wär nett, wenn ihr mir nen Tip gebt, welche Funktionen ich für die Berechnungen brauche. |
||
![]() |
Alfadur |
![]() Antworten mit Zitat ![]() |
---|---|---|
atan2 für den winkel, die geschwindigkeit legst du selber fest... du hast deine objekte alle sicher in nem type, also legste dort einfach noch ein field für geschwindigkeit an, da haste volle kontrolle .. | ||
A Cray is the only computer that runs an endless loop in less than four hours. |
TheMagician |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. Zum Winkel-Problem:
Ok, ich hab jetzt Atan2 für den Winkel verwendet und nach einigem Probieren spuckt mir das Programm jetzt den korrekten Winkel zwischen Zielobjekt und sich bewegendem Objekt aus. Entweder als Wert zwischen -180 und +180 oder (wenn ich so ne komische "Mod" Funktion nehme) zwischen 0 und 360. Welche soll ich verwenden? Und wie mache ich letztendlich die Drehung? Soll ich den Winkel zwischen den Objekten in eine Variable speisen, dann das Objekt um 1 Grad drehen und dann 1 von der Variable abziehen und es dann wieder drehen bis die Variable 0 ist? 2. Zu der Bewegungs-Geschichte: Ja, ich weiß was ein Type ist, aber was ein "Field" für die Geschwindigkeit ist ... und wie ich dann die volle Kontrolle habe verstehe ich nicht ![]() Aus der Beschreibung von "Field" in der Hilfe werd ich leider auch nicht recht schlau. Ne Funktion "IsEntityMoving" gibt's wohl leider nicht. Ich wär euch wirklich dankbar, wenn ihr mir noch weiter auf die Sprünge helfen würdet. Stefan |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Im Feld 'Geschwindigkeit' steht einfach ein Wert, mit dessen Hilfe du die Bewegungsgeschwindigkeit in einem bestimmten Zeitintervall festlegst. Z.B.: BlitzBasic: [AUSKLAPPEN]
Ne, IsEntityMoving, sowas gibts nich... Aber du kannst die Differenz, der Bewegung zwischen mehreren Frames, eines Entities ausrechnen. Wenn die unter einem bestimmten Wert liegt, dann bewegt sichdein Entity nichmehr... Logisch! ![]() grüße |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du weist ja schon wie man die Winkeldifferenz berechnet. Du schaust jetzt am besten in welche Richtung du das Objekt drehen musst, also den Winkel von deinem Objekt zum Zielobjekt nehmen (am besten per Mod von 0-360 ausgeben lassen) und schauen in welchem Winkel sich dein Raumschiff befindet. Die Differenz von beidem ist dann die Richtung in die du das Objekt bewegen musst. Um das ganze etwas langsamer zu drehen schaust du nur ob die Differenz positiv oder negativ ist (Befehl "sgn()") und dann drehst du das Objekt um eine gewisse Gradzahl mal dem Ergebnis aus sgn() mit dem Befehl turnentity. Das Objekt kannst du per moveentity deinobjekt\mesh,0,deinobjekt\speed,0 bewegen.
Ein "field" für Geschwindigkeit ist: type deinobjekt field speed# < Das ist ein "field" für Geschwindigkeit. field mesh end typ Wenn du einen Type definierst musst du doch felder darin anlegen, also Variablen in denen du die Werte eines Type-Eintrages speicherst. |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
Gerhard |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielleicht wäre statt Pointentity... der Befehl Aligntovector.... geeignet, da dieser auch einen Wert für die Geschwindigkeit der Drehung beinhaltet. | ||
TheMagician |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für eure Antworten!
Also wichtig ist vielleicht noch zu sagen, dass mein dehendes Objekt kein Raumschiff ist, sondern ein Mensch. @Gerhard: AlignToVector hab ich mal probiert. Das Problem ist, dass sich der Gegenstand dann auf den Zielobjekt "ausrichtet", das heißt, er dreht seine X,Y,Z Achsen so, dass sie auf das Zielobjekt zeigen. Meine Mensch-Figur hebt dann also vom Boden ab und zeigt mit dem Kopf (wie ein Pfeil) auf das Zielobjekt. Bei PointEntity dreht sich mein Objekt nur um die "menschlichen Achsen". Is schwer zu beschreiben, aber ich glaube für die Art von Drehung die ich suche eignet sich AlignToVector leider nicht. @Firstdeathmaker Danke für die nette Beschreibung. Leider hab ich wohl doch einen Fehler in meiner Winkelberechung. Ich hab jetzt mal den Atan2 beobachtet wenn ich das Zielobjekt (Z) in einem Kreis um das Drehobjekt (x) bewege. Der Atan2 beginnt bei 0. Dann bewegt sich das Zielobjekt eine Viertel Drehung um das Drehobjekt ... jetzt ist der Atan2 bei 90. Doch wenn das Zielobjekt sich jetzt weiterbewegt geht der Atan2 plötzlich wieder auf 0 zurück ... jetzt ist praktisch ein Halbkreis fertig. In der zweiten Hälfte der Bewegung geht der Atan2 wieder auf 90 hoch und dann wieder zurück auf 0. Ich dachte er sollte sich kontinuierlich von "0" bis "360" ändern? Mache ich doch noch was falsch bei der Berechnung des Winkels? BlitzBasic: [AUSKLAPPEN]
@David: Ich denke wir sollten uns erstmal dem Dreh-Problem widmen. Dann kommen wir wieder auf die Bewegung zurück. Aber danke schonmal für deine Tips! |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
nimm nicht "abs". Du brauchst für die Berechnung die Differenz, nicht den Abstand. Die Differenz kann auch negativ sein. Du bekommst nur Werte bis 90 weil du die negativen Differenzen mit "abs" zu positiven konvertierst. | ||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
TheMagician |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Firstdeathmaker:
Hab deinen Rat befolgt. Jetzt krieg ich tatsächlich einen schönen Winkel von 0 bis 360 Grad! Danke. Ich werde jetzt hier mal ein Stück des relevanten Codes posten, denn mein Objekt macht zwar jetzt schon einiges richtig: z.B. dreht es sich erst und dann beginnt es sich auf das Zielobjekt zuzubewegen aber die Drehung an sich scheint mir immernoch total willkürlich zu sein. BlitzBasic: [AUSKLAPPEN]
Was mich am meisten ärgert ist, dass das Drehobjekt nachdem es sich gedreht hat (und die Drehung ist natürlich auch nicht richtg) immer noch einen Sprung macht, also es dreht sich kurz bevor es dann in richtung Zielobjekt losfährt nochmal um einen unberechenbaren Winkel und fährt dann los (wenigstens fährt es in die richtige Richtung ![]() Würd mich freuen wenn sich jemand von euch den Code anschaut! Stefan |
||
TheMagician |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Noch eine Frage:
Ist es richtig, dass wenn sich ein Objekt 360 Grad um die eigene Y-Achse dreht und ich den Drehwinkel kontinuierlich mit "EntityYaw" abfrage, sich der Winkel dann NICHT von 0 bis 360 Grad verändert, sondern erst von 0 bis 180 steigt, dann umspringt auf -180 Grad und von dort wieder zurück zur 0 läuft? Wenn ja, kann ich "EntityYaw" ja nicht für die Drehwinkel-Abfrage benutzen weil sie nur in der Hälfte der Fälle funktioniert (nämlich von 0-180 Grad). |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group