GLBasic forum

Main forum => Tutorials => Topic started by: Schranz0r on 2009-Jan-31

Title: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Schranz0r on 2009-Jan-31
Wiedermal ohne Worte :D
(Code ist hoffentlich selbsterklärend?! )

Bei Fragen einfach... öhmm.. fragen :D


Das neuste EntitySystem gibts immer unter folgenden Link:
http://www.glbasic.com/beta/EntitySystem.zip

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(Cuboid,Pivot) // Den Quader an den Drehpunkt "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(Pivot,0,-MOUSEAXIS(0)/5,0) // Drehen mit der Maus in X-Richtung um die Y-Achse

        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
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Quentin on 2009-Jan-31
hehe chic, Grundlage für ein Autorennen, Slalom fahren um die Achsen geht schon ganz gut. Und vor allem supereinfach  :good:
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Schranz0r on 2009-Jan-31
Lustig, dachte ich mir auch schon :D
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Oct-16
Danke für den Code und sorry, dass ich so ein altes Thema ausgrabe. (Thanks for that code and sorry to bump such an old topic)

Ich würde das nun gern so haben, dass ich nicht nur links/rechts drehen kann sondern auch hoch/runter. (I'd like to change the code that way I not only can turn left/right but also up/down -> pitch).

Prinzipiell ersetze ich dafür die Zeile (Generally I replace the line)

Code: GLBasic [Select]
EntityRotate(Pivot,0,-MOUSEAXIS(0)/5,0) // Drehen mit der Maus in X-Richtung um die Y-Achse
 

ja einfach mit (with)
Code: GLBasic [Select]
EntityRotate(Pivot,MOUSEAXIS(1)/5,-MOUSEAXIS(0)/5,0)    // Drehen mit der Maus in X-Richtung um die Y-Achse
 

ABER... Natürlich fängt er auf dadurch auch, je nach Drehwinkel, das Rollen an. Wie kann ich das unterbinden? (BUT... Of course that will lead to some roll rotation dependent on the yaw component. How can I avoid that roll component?)

Danke!
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: kanonet on 2012-Oct-16
Du darfst dafür nicht den Pivot drehen, sondern musst dies am Objekt selbst (der Kamera) tun.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Oct-16
Danke, das ist durchaus nicht ohne. ;) Toll wäre es, wenn es ein EntityAlignTowards gäbe, wo die Kamera trotzdem ausgerichtet bleibt.

Gut, ich kann ja die Kamera am Pivot dran lassen, dann hab ich wenigstens schon mal die richtige Position. Die Drehung muss ich dann wohl oder übel selbst berechnen...
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: kanonet on 2012-Oct-16
Nein musst du nicht selbst berechnen, einfach nach dem pivot drehen noch das objekt (die cam) drehen.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Oct-16
Ja in der Theorie ist das klar und klingt einfach, aber die Kamera hat ja durch den Pivot bestimmte Position im Raum. Nur kann ich jetzt nicht einfach eine Achse auf Null setzen und alles stimmt wieder...
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: kanonet on 2012-Oct-16
Es funktioniert auch in der Praxis, ist ja der Sinn eines ES. ;)
Zur Demonstration:
Code: GLBasic [Select]
        EntityRotate(Cam, MOUSEAXIS(1)/5,0,0)
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Oct-16
Danke. Funktioniert teilweise, ja. Aber eben nur teilweise. Zwar kippt so die Kamera schön und rollt nicht, aber sie schaut eben auch nicht mehr zum Pivot. ;)
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: kanonet on 2012-Oct-16
Naja, da ist doch aber auch logisch, oder? Wenn der Pivot unter der Kamera ist und du drehst diese nach oben, dann ist es doch die logische Folge, dass die Kamera vom Pivot weg gedreht ist. Wie sollte das auch anders gehen? Einzige Möglichkeit wäre, dass du die Position der Kamera einfach veränderst, am einfachsten geht das mit einem zweiten Pivot.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Oct-17
Ja natürlich ist das logisch, hab ich doch geschrieben. Insofern ist das keine Lösung. Werde ich wohl meine angestaubten Mathe-Kenntnisse ausbuddeln müssen. Ein zweiter Pivot hilft da überhaupt nicht.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Schranz0r on 2012-Oct-17
Servus,

Du hast das Problem das du dich aufm Kopf stellst oder?
Ich machs immer so, wenn ich es selber schreibe ohne ES, dass ich die Winkel limitiere also Max. -89.99 und +89.99.
Ab 90° kommt der "Flipover" :D
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Oct-17
Danke, nein, diesen Flipover meine ich nicht. Wenn man um 2 Achsen rotiert, muss die Kamera zwangsläufig "rollen". Genau das will ich aber nicht.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Schranz0r on 2012-Oct-17
Achso, sollte aber mit dem ES auch machbar sein...
Schau ich mir heute Abend mal an!
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Oct-17
Das ist lieb, danke!
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: kanonet on 2012-Oct-17
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.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Schranz0r on 2012-Oct-17
Er will immer der Blickrichtung nachfliegen.
So ne Art Spectatormodus?!

Sry, komm heute leider nicht dazu!
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: kanonet on 2012-Oct-18
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?
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: backslider on 2012-Oct-18
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
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Oct-18
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.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: 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?
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: tft on 2012-Oct-18
Hallo,

der Link am Anfang funktioniert nicht mehr.

Gruss TFT
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: backslider on 2012-Oct-19
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.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: kanonet on 2012-Oct-19
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.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Schranz0r on 2012-Oct-19
Hallo,

der Link am Anfang funktioniert nicht mehr.

Gruss TFT


schau mal hier:

http://www.glbasic.com/beta/EntitySystem.zip
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Nov-02
Sorry für die wirklich späte Antwort, aber ja, das hat geholfen. Herzlichen Dank!
Title: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Kitty Hello on 2012-Nov-03
Super. Schön zu sehen, dass im deutschen Forum wieder was los ist.
Title: Re: ENTITY SYSTEM: So einfach wird eine 3rd-Person-Steuerung gemacht!
Post by: Xaron on 2012-Nov-03
Ja, ich werde mal sehen, dass ich auch mal ein bißchen was beitrage.