Objekt erst drehen und dann bewegen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

TheMagician

Betreff: Objekt erst drehen und dann bewegen

BeitragDo, Apr 14, 2005 11:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 14, 2005 12:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 14, 2005 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Apr 14, 2005 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 15, 2005 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused
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

BeitragFr, Apr 15, 2005 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Im Feld 'Geschwindigkeit' steht einfach ein Wert, mit dessen Hilfe du die Bewegungsgeschwindigkeit in einem bestimmten Zeitintervall festlegst.

Z.B.:
BlitzBasic: [AUSKLAPPEN]

bewegungsvektor = bewegungsvektor + geschwindigkeitskonstante * ( 1 / framezeit )


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! Wink

grüße

Firstdeathmaker

BeitragFr, Apr 15, 2005 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 15, 2005 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht wäre statt Pointentity... der Befehl Aligntovector.... geeignet, da dieser auch einen Wert für die Geschwindigkeit der Drehung beinhaltet.
 

TheMagician

BeitragFr, Apr 15, 2005 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

AbstandX = Abs(EntityX(player_pivot)) - Abs(EntityX(mesh))
AbstandZ = Abs(EntityZ(player_pivot)) - Abs(EntityZ(mesh))
RichtungWinkel= (ATan2(AbstandZ,AbstandX)+360) Mod 360


@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

BeitragFr, Apr 15, 2005 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 16, 2005 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@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]

While Not KeyHit(1)

Cls

If MouseHit(1)=True Then

ClickedSpot = CameraPick (camera,MouseX(),MouseY())
ClickedSpotX = PickedX()
ClickedSpotY = PickedY()
ClickedSpotZ = PickedZ()

If PickedNY() <= 1 And PickedNY() > 0.7 Then ;Testet ob der Spieler auf den Boden oder auf die Wand geklickt hat

PositionEntity player_pivot,ClickedSpotX,ClickedSpotY,ClickedSpotZ ;Das unsichtbare Zielobjekt wird gesetzt

RichtungX = EntityX(player_pivot) - EntityX(mesh)
RichtungZ = EntityZ(player_pivot) - EntityZ(mesh)
RichtungWinkel= (ATan2(RichtungZ,RichtungX)+360) Mod 360 ;Winkel zwischen Drehobjekt und Zielobjekt
EndWinkel = RichtungWinkel - EntityYaw(mesh) ;Ermittelt den Wert um den sich das Drehobjekt drehen muss
WinkelRichtung = Sgn(EndWinkel) ;Ermittelt die Richtung in die sich das Drehobjekt drehen muss

PlayerWalk = 1
EndIf
EndIf


If PlayerWalk = 1 Then

If Endwinkel <> 0 Then ;Die Phase in der das Drehobjekt auf das Zielobjekt zugedreht wird.
If WinkelRichtung < 0 Then ;Das Drehobjekt muss sich nach links drehen
TurnEntity mesh,0,-1,0
EndWinkel = EndWinkel + 1
ElseIf WinkelRichtung > 0 Then ;Das Drehobjekt muss sich nach rechts drehen
TurnEntity mesh, 0,1,0
EndWinkel = Endwinkel - 1
EndIf

ElseIf Endwinkel = 0 Then ;Nach abgeschlossener Drehung bewegt sich das Objekt auf den Zielpunkt zu
If EntityDistance(mesh,player_pivot) > 3 Then
PointEntity mesh,player_pivot
ElseIf EntityDistance(mesh,player_pivot) < 3 Then
PlayerWalk = 0
EndIf
MoveEntity mesh,0,0,2
EndIf

EndIf


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 Confused )

Würd mich freuen wenn sich jemand von euch den Code anschaut!
Stefan
 

TheMagician

BeitragSa, Apr 16, 2005 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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).

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group