3D Entity System [DE]

Previous topic - Next topic

trucidare

Cobra ist von der syntax her eine DIV / Fenix Adaption. also nichts neues und tolles.
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

OK, jetzt mein Senf zum Entitysystem. Ich hab' damals keine Ahnung von 3D gehabt. Dann hab' ich mir überlegt, wie mach ich das in 2D, und hab' einfach 'Z' dazugenommen.
Dann waren die Befehle einfach zu lang. Also, hab ich Position, Drehung, Skalierung vorne als eigene Befehle vorweg genommen.
Statt:
Code (glbasic) Select
ROTOZOOMSPRITE id, x,y, fac, phiMacht man:
Code (glbasic) Select
X_SCALING sx,sy,sz
X_MOVEMENT x,y,z
X_ROTATION phi, rx,ry,rz
...
X_SETTEXTURE id, -1
X_DRAWOBJ id, 0
Jetzt erkenne ich, dass das vielen nicht so passt. Es bleibt aber so drin. Dafür mach ich euch ein Entitysystem das eine 1:1 kopie von Blitz3D wird. Dannach verbesser' ich's wo ich mein.
Wär' doch gelacht.

x-tra

Toll super bist ein Schatz, ich meinte ja auch ein zusätzliches E.-System.

Vielen Vielen Dank

Und wenn du dann dabei bist, bei den ganzen move rotate parent usw. geschichten überall einen optionalen parameter für globale oder relative entitybefehlausführung mit einplanen, wär nett.

So, jetzt hock ich in den startlöchern unf freu mich schon sehr.

Sebe

Go Gernot Go!

D2O

Armer Gernot, Du musst Dir wirklichlich den Ar**** aufreisen für unsere/Deine Community.
Aber auch schön das unsere Wünsche nicht ins leere laufen.

Solltest Du mal richtung Lindau/Bregenz unterwegs sein, dann Melde Dich, ich geb ne Runde aus :)
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

Hab ich das jetzt richtig verstanden?
Fest eingebautes Entitysystem ?!?!
Ich glaube damit erfüllst du hier einigen einen Traum!

Wenn du hilfe brauchst melde dich, ODER 5x Bellen ;)

Wie wärs den mal mit einer Art Stammtisch Treffen?

D²0 , BumbleBee und meine wenigkeit wohnen ja nur nen Katzensprung von dir weg ;)
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

D2O

Jepp, Ihr seit nicht weit weg von mir.
Hätt mich auch schon lange mal gemeldet, was ein Treffen angeht.
Nur hab ich relative wenig zeit irgendwo hin zu gurken, musste erst vor kurzem
ein Treffen mit tft absagen :(
Zur zeit habe ich fast jedes wocheende durch gearbeitet und ab November geht bei mir der umzug los :)

Aber generel gesehen bin ich einen Treffen immer zugeneigt, bzw.
meine Tür steht für sowas immer offen.
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Kitty Hello

So Feunde :D
http://www.glbasic.com/beta/entity.rar
Mit rechter MT -> Werkzeuge/Hilfe erstellen habt Ihr eine Hilfe.
Das Ding kann jetzt modelle, kamera(s), Lichter und parent-relations. Achtung:
Wenn A parent von B, und B parent von C, und C wieder parent von A ist, dann hamma hier eine Rekursion, die sich in einem schwarzen Bildschirm mit einem brüllenden Fön wiederspiegeln wird... ;)

So, was fehlt? Kollisionen, oder?
Mag bitte, bitte einer helfen!?

Zur Info: Die Objekte sind alle in einem Feld: g3DObj[]. Wenn man einen "handle" hat, bekommt man das TYPE so:
Code (glbasic) Select
LOCAL t AS T3DEntity
t = g3DObj[handle]
t.x = 100
Wichtig für euch: Jedes Objekt hat 2 Matritzen (Transformations-Matrix). M[], das ist die lokale, Mg[], das ist die globale - also falls man einen Parent hat.
Die Matrix ist ganz einfach 4 Spaltenvektoren aneinander, die die X-y-z Achse und die Verschiebung des Objekts darstellen.
Code (glbasic) Select
0 4  8 12
1 5  9 13
2 6 10 14
3 7 11 15
Also, ganz kurz, die X-Achse von einem Objekt ist:
t.MgY-Achse:
t.Mg[4], t.Mg[5], t.Mg[6] // die 2. Spalte

Die Postition (x,y,z) ist
t.Mg[12], t.Mg[13], t.Mg[14]

Damit sollte man Kollisionen machen können, oder? Hmm.. Woher den Kugelradius...
OK, ich mach's wieder mal alleine *heul*

Jedenfalls - bitte anbei testen (läuft komplett so weit ich sehe) und Feedback geben.

x-tra

Cool, auf jeden, du hast sogar meinen Quellcode von Cobra3D übernommen, den kann ich ja noch bisschen verbessern.

Ist mit dem Start der .exe das Entity System gleich mit drin jetzt?

Wenn ich verbesserungsvorschläge haben sollte, werd ichs hier posten.

Ich werd erstmal das Beispiel von dir wegen der steuerung etwas ausbessern, okay.


[edit]  moveentity   bewegt das entity entlang der globalen koordinaten, sollte aber auch möglich sein dies relativ zu den eigenen koordinaten und abhängig von eigener Rotation sein, also wenn ich das schiff drehe, und dann nach vorn bewegen will, sollte auch vorn immer vorn sein.

P.S. Ich dachte erst vor und zurück seien vertauscht, aber das mit dem move haut nich hin, solltest du auf relativ  und global ändern.  aber das hat sich mal vor und zurück bewegt kam immer auf die vorhergehende richtung an.

Grübel grübel
Ich versuch dann bisschen auszubessern, und kann ja das beispiel posten, oder ich warte bis du haben fertig und mach dann gleich ein komplettes Bsp.

Würd dir ja gern helfen, aber so systemintern kenn ich mich in GLB noch nicht aus.

Kitty Hello

Kapiert. MoveEntity also in lokaler richtung. Check!

Nein, das EntitySystem ist eine .gbas Datei, die man derzeit einbinden müsste. Ist auch kein Stress, oder?
Evtl. Bau ich's später doch fest ein - muss man sehen.

[edit]
Neuer Upload - jetzt ist MoveEntity relativ to lokaler Achse. PositionEntity ist global, absolut.

tft

Hi ......

:-)

x-tra

super danke gernot, gleich mal testen

Funktioniert tadellos, okay die relativen drei x,y,z pfeile drehen sich nicht mit, aber das ist ja nur optisch.

Wäre toll, wenn das mal als update kommt, sodass man das nicht mit einbinden muss.

Eine Frage noch, bei C3D gibt es den Parameter "usedelta" welches wie diese Timing codeschnippsel hier irgendwo funktioniert. Also das Spiel läuft auf jedem PC gleich schnell, bzw. die bewegung, kannst du wenn du irgendwann mal Zeit hast, sowas auch machen?



Zitat aus der C3D Help: If you supply the "usedelta" parameter as True, then the movement distance will be affected by the in-built delta timer. This helps your game to play at the same speed on any computer.    ---  hängt z.B. an entitybefehlen mit dran, z.B. moveentity, x, y, z, True      bsp.

Kitty Hello

Ich kapier' nicht, wie man die Kollisionen machen soll.
Hat schonmal jemand mit Blitz bzw. einer anderen Entity-Sprache gearbeitet und kann mir helfen?
Soll man jedem Entity einen "Typ" (Zahl) zuweisen lassen, und dann fragen, ob so ein Ding kollidiert hat?
Soll man eine Liste mit allen kollisionen machen? Oder alle mit einem bestimmten Typ?

x-tra

CollisionInclude   definiert verschiedene Objekte(entities) als eine Zahl, oder auch Gruppen wären denkbar, also z.B. eine Gruppe Gegner/Welt usw.    mit der darauf folgenden Kollisionsart und Reaktion.  Wäre sozusagen wenn man mal alle Entities definiert hat, sozusagen nur noch jeweils ein Befehl notwendig welcher Art und Reaktion regelt.




http://blitzbase.de/menu/3h.htm    oder http://blitzbase.de/befehle3d/collisionentity.htm

vielleicht hilft das ja.


es gibt ja auf jeden Fall Kugel, und Box Kollisionen.

In dem Fall wird sozusagen wie ein parent um das objekt gestellt, und dann werden eben entweder einzeln die möglichen Kollisionen durchgeprüft, oder eben ob z.B. Objekt-Boden   oder Objekt Welt, also gruppenkollisionen.

Denkbar wären auch die daraufhin folgende Kollisionsart.

Also wenn z.B.   in C3D: CollisionInclude(cube,1,C3D_ADVAUTO+C3D_ADVSTATICOBJ,0,0,0,20)
 CollisionInclude(ball,2,C3D_ADVELLIPSE+C3D_ADVSLIDECOLL ,0.5,0.5,0.5)

Vom kollidierten Obj. wegsliden usw.



C3D_COLLPOINT   0;
C3D_COLLSPHERE   1;
C3D_COLLELLIPSE   2;
C3D_COLLCUBE   3;
C3D_COLLFACES   4;
C3D_ADVELLIPSE   10;
C3D_ADVCUBE   11;
C3D_ADVMESH   12;
C3D_ADVAUTO   16;

Da haben wirs ja fast, oder eher du.

Ganz tolle arbeit gernot, jetzt hab ich seit heut auch C3D Lizensiert da, progge ich also 2sprachig, warum nicht.

Sebe

Die Blitz3D Kollisionen sind nicht besonders robust, evtl. wäre folgender Ansatz sinnvoll:

- eine Art linked list die ausschliesslich Entities aufnehmen kann
- eine Funktion, der man als Parameter ein Entity übergibt, z.B. CollisionListAdd(myCoolEntity) und die das Entity dann in die Liste aufnimmt
- eine Funktion, der man als Parameter ein Entity übergibt, z.B. CollisionHappen(myCoolEntity2) und die dann im Falle einer Kollision das Handle
des Entites zurückgibt, mit der kollidiert ist, z.B. in der main loop:

If(CollisionHappen(myCoolEntity2) = myCoolEntity) Then
  entity1Damage = entity1Damage + 10
  entity2Damage = entity2Damage + 10
EndIF

Das Kollisionssystem würde dann intern immer überprüfen, ob eine Kollision stattfindet. Entites wieder rauslöschen müsste man dann auch können
(wenn z.B. ein Fahrzeug kaputtgefahren worden ist CollisionListSubtract(myCoolCar) oder so).
Cool wäre es auch, wenn man das ganze mit Newton verknüpfen könnte.

P.S.: Ich wohn afaik auch nicht weit weg: Neuaubing in München, wobei ich jedes Wochenende zu meiner Freundin nach Neufahrn fahre (wenn nicht grade wieder Streiks sind und ich andere Lösungen suchen muss grmll)...