ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!

Previous topic - Next topic

kanonet

Glaub mir, es geht mit dem ES. Wenn ich verstehen würde, wie du es nun haben willst, dann würde ich es dir zeigen... Aber wie soll sich die Kamera drehen, ohne den Pivot aus dem Blick zu verlieren und ohne die Position zu verändern? Wenn du klar machst, wie du es meinst, dann können wir dir auch helfen, aber im Moment hab ich wohl einen Knick im Schlauch.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Schranz0r

Er will immer der Blickrichtung nachfliegen.
So ne Art Spectatormodus?!

Sry, komm heute leider nicht dazu!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

kanonet

So nach der Art: man hat ein Flugzeug, dass fliegt und die Kamera befindet sich immer auf einer bestimmten Position relativ dazu (z.B. immer dahinter)?Aber das wäre dann natürlich keine direkte Kamerasteuerung mehr, sondern nur eine indirekte, schließlich steuert man eigentlich das Objekt und nicht die Kamera, diese folgt ja nur? Aber realisieren lässt sich das sehr einfach, wie bereits erwähnt.
Oder habe ich die Sache falsch verstanden?
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

backslider

Also entweder verstehe ich das Problem hier vollkommen falsch von Xaron, oder die Lösung ist denkbar einfach.

Wenn du ein Entity hast, z.B. ein Flugzeug und willst diesem mit der Kamera folgen, dann machste das pseudomäßig so:

1. Erstelle Kamera Entity
2. Setze Position der Kamera relativ zum Flugzeug
3. Erstelle Flugzeug Entity
4. Sag mit EntityParent, dass das Flugzeug Mutti von der Kamera ist

Zick zack und die Kamera folgt immer dem Flugzeug mit Blickrichtung auf dieses, wenn du in der Updatemethode EntityAlignTowards (glaube ich, so hieß die Funktion) aufrufst und der Kamera sagst, dass sie zum Entity Flugzeug gucken soll...

Problem gelöst, oder habe ich es falsch verstanden?

MfG

Xaron

Danke Leute,

folgendes hab ich vor: Ich habe ein Schiff und eine Kamera. Die Kamera will ich um dieses Schiff in der Außenansicht frei drehen können, so dass ich das Schiff von links/rechts aber auch oben/unten anschauen kann.

Dazu habe ich ein Pivot, welches das Schiff als Parent hat. Die Kamera wiederum hat als Parent den Pivot. Wenn ich also diesen Pivot drehe, rotiert auch meine Kamera mit, schön.

Nur links/rechts (also Y-Achse) ist simpel, klar. Wenn ich jetzt aber auch die X-Achse dazunehme, fängt er das rollen an, je nach Y-Winkel. - auch klar...

Bei Blitz3d gab's da dieses PointEntity, wo ich als dritten Wert den Rollwinkel angeben konnte. Wenn der auf 0 war (default), dann ging's.

kanonet

Ah jetzt habe ich es verstanden, dass bedeutet, dass die Kameraposition geändert werden muss. Ist ganz einfach, entweder einen zweiten Pivot einfügen, oder das Schiff als Pivot nutzen.
Hier mal das Beispiel aus dem ersten Post modifiziert, dass es denke ich deine Anforderungen erfüllt:
Code (glbasic) Select
LOCAL Cam, Pivot, Axis, Cuboid// Locale Variablen

Cam = EntityCreateCamera() // Erstelle eine Kamera
EntitySetCameraRange(Cam, 1, 1000) // Setze Sichtweite

Pivot = EntityCreatePivot() // Erstelle einen Drehpunkt
Cuboid = EntityCreateCuboid(3,2,6) // Quader erstellen ( zum angucken :D )

EntityParent(Cam,Pivot) // Die Cam an den Drehpunkt "heften"
EntitySetPosition(Cam,0,30,30,FALSE) // Die Kamera weg vom Drehpunkt bewegen
EntityAlignTowards(Cam,Pivot) // Kamera schaut immer in Richtung der Drehachse
EntityParent(Pivot,Cuboid) // Den Drehpunkt an den Quader "heften"

// Ein paar Achsen Zeichen und die Bewegung sichtbar zu machen
FOR x = 0 TO 2
FOR z = 0 TO 10
LOCAL A
A = EntityCreateAxes(2) // erstelle eine Achse mit 2 Einheiten grösse
EntitySetPosition(A,x*20-20, 0, z*20-100 ) // Setze Position
NEXT
NEXT

WHILE TRUE
EntityRotate(Cuboid,0,-MOUSEAXIS(0)/5,0) // Drehen mit der Maus in X-Richtung um die Y-Achse
EntityRotate(Pivot, MOUSEAXIS(1)/5,0,0)

IF KEY(200) THEN EntityMove(Pivot,0,0,-1) // Bei Pfeiltaste HOCH, gehe vorwaerts
IF KEY(208) THEN EntityMove(Pivot,0,0,1) // Bei Pfeiltaste RUNTER, gehe rückwaerts


EntityDrawSystem() // Zeichne alles !
SHOWSCREEN
WEND
END

Ist es damit getan?
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

tft

Hallo,

der Link am Anfang funktioniert nicht mehr.

Gruss TFT

backslider

Quote from: kanonet on 2012-Oct-18
Ah jetzt habe ich es verstanden, dass bedeutet, dass die Kameraposition geändert werden muss. Ist ganz einfach, entweder einen zweiten Pivot einfügen, oder das Schiff als Pivot nutzen.
Hier mal das Beispiel aus dem ersten Post modifiziert, dass es denke ich deine Anforderungen erfüllt:
Code (glbasic) Select
LOCAL Cam, Pivot, Axis, Cuboid// Locale Variablen

Cam = EntityCreateCamera() // Erstelle eine Kamera
EntitySetCameraRange(Cam, 1, 1000) // Setze Sichtweite

Pivot = EntityCreatePivot() // Erstelle einen Drehpunkt
Cuboid = EntityCreateCuboid(3,2,6) // Quader erstellen ( zum angucken :D )

EntityParent(Cam,Pivot) // Die Cam an den Drehpunkt "heften"
EntitySetPosition(Cam,0,30,30,FALSE) // Die Kamera weg vom Drehpunkt bewegen
EntityAlignTowards(Cam,Pivot) // Kamera schaut immer in Richtung der Drehachse
EntityParent(Pivot,Cuboid) // Den Drehpunkt an den Quader "heften"

// Ein paar Achsen Zeichen und die Bewegung sichtbar zu machen
FOR x = 0 TO 2
FOR z = 0 TO 10
LOCAL A
A = EntityCreateAxes(2) // erstelle eine Achse mit 2 Einheiten grösse
EntitySetPosition(A,x*20-20, 0, z*20-100 ) // Setze Position
NEXT
NEXT

WHILE TRUE
EntityRotate(Cuboid,0,-MOUSEAXIS(0)/5,0) // Drehen mit der Maus in X-Richtung um die Y-Achse
EntityRotate(Pivot, MOUSEAXIS(1)/5,0,0)

IF KEY(200) THEN EntityMove(Pivot,0,0,-1) // Bei Pfeiltaste HOCH, gehe vorwaerts
IF KEY(208) THEN EntityMove(Pivot,0,0,1) // Bei Pfeiltaste RUNTER, gehe rückwaerts


EntityDrawSystem() // Zeichne alles !
SHOWSCREEN
WEND
END

Ist es damit getan?

Das ist doch aber genau dasselbe, wie mein Pseudocode, oder sehe ich das falsch?^^
Ich glaube, so hatte es bei ihm nicht funktioniert.

kanonet

Nicht ganz das selbe, du hattest den Pivot vergessen, wobei klar gewesen sein sollte, dass er da rein gehört.
Aber es ist das selbe wie ich schon beschrieben hatte (nur dass ich das Objekt als 2. Pivot missbrauche), aber da unsere Beschreibungen ihm anscheinend nicht ausreichten, habe ich eben einfach mal funktionierenden Code hingesetzt. Denke damit ist seine Frage jetzt erledigt, mal sehen, was er sagt.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Xaron

Sorry für die wirklich späte Antwort, aber ja, das hat geholfen. Herzlichen Dank!

Kitty Hello

Super. Schön zu sehen, dass im deutschen Forum wieder was los ist.

Xaron

Ja, ich werde mal sehen, dass ich auch mal ein bißchen was beitrage.