3D Entity System [DE]

Previous topic - Next topic

Kitty Hello

Update:
// PHOO: - New parameter: EntityAddCollision: group_src, group_dest, COLLISION_MODE
//       - New commands: EntityCollisionSetRadius, EntityCollisionSetBox
//                       EntityCreateCuboid

Alles wie bei Blitz, wobei der Wert "1" u.U. falsch sein könnte.

x-tra

#211
ich hab jetzt noch nicht geschaut, aber was meinst du mit wert "1"

hab das grad mit dem radius probiert.

kommt eine fehlermeldung.

Code (glbasic) Select
call to undefined function : X_COLLISIONSPHEREBOX


da fehlt wohl was....lol

BumbleBee

Wie kann man sich eigentlich bei Gernot dafür bedanken, dass er immer soviel für uns macht und auch immer gleich macht, obwohl er ja wenig Zeit hat? Vielleicht mit paar tollen Spielen die mit oder ohne ES gemacht wurden? Beim GLBasic Treffen kriegt er eh alles spendiert. Das steht schon mal fest.  :booze:
Ich denke, so langsam sollte oder müßte ich wohl auch mal einen Blick auf das ES werfen. =D

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Schranz0r

Total geil das Teil, ich finds subba jut dat dingendskirchen...ähhhh ... EntitySystem ;)
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

x-tra

#214
Bis auf
Code (glbasic) Select
X_COLLISIONSPHEREBOX, was noch nichts existiert, funktioniert es suuuper, also sphere-mesh (0) hab ich getestet, läuft bisher, muss noch bissl mitm radius testen, aber feine sache, ganz toll gernot.

kann ich weiter machen, hab derweil

Code (glbasic) Select
CASE 2
//sphere[1]->box[2]
LOCAL r = object1.col_radius * MIN(object1.sx, MIN(object1.sy, object1.sz) )
col = X_COLLISIONSPHEREBOX( object1.Mg[12], object1.Mg[13], object1.Mg[14],object1.col_radius, _
object2.col_bx*object2.sx, _
object2.col_by*object2.sy, _


auskommentiert.

Kitty Hello

Oh ich Depp! Ja, das wird ein größeres Update. Muss man bis dahin auskommentieren.

x-tra

lol oben steht schon version 5.307, aber online ist sie noch nicht.

hab noch 5.304 und update wird mit meldung "aktuell" beendet.


Kitty Hello

ganz großer Fehler in der aktuellen, darum hab ich sie vom Netz genommen.

x-tra

achso, nadann kein thema.

achja, kannst du die neuen kollisionsbefehle für alle die nicht von bb kommen erklären, ist sicher einfacher zu verstehen als

Code (glbasic) Select
0=sphere-mesh, 1=box-mesh, 2=sphere-box

ich mein ich weiß wie es funktioniert, aber für die meisten hier....

Schranz0r

#219
Bei EntityCollisionSetBox sollte sich die Collisionbox auch mit dem Objekt mitdrehen oder?
So wie ich das seh, wird das nicht gemacht.
Und was optisches(Drahtgitter) wenn Debug an ist, wär auch super!

Sonnst soweit echt gut!

Hab bei Cuboid die Texturen richtig rum gesetzt, da hat irgendwie kein Face gepasst  :noggin:  :good:

Code (glbasic) Select
//! This function creates a cuboid with the dimensions:
//! sx x sy x sz
// \param sx,sy,sz - width, height and depth of the cuboid
// \return the entity entity
FUNCTION EntityCreateCuboid: sx, sy, sz
LOCAL col=RGB(0xff,0xff,0xff)

LOCAL t AS T3DEntity
LOCAL nc
t.what = 0
t.tex=-1
t.ddd=0

// Get free object slot
nc = X_NUMFACES(t.ddd)
WHILE nc>0
INC t.ddd, 1
nc = X_NUMFACES(t.ddd)
WEND
X_AUTONORMALS 1 // For a cube, hard edges
sx=sx/2
sy=sy/2
sz=sz/2
X_OBJSTART t.ddd
// Front Face
X_OBJADDVERTEX  sx, -sy,  sz, 1, 1, col // ul
X_OBJADDVERTEX -sx, -sy,  sz, 0, 1, col // ur
X_OBJADDVERTEX  sx,  sy,  sz, 1, 0, col // ol
X_OBJADDVERTEX -sx,  sy,  sz, 0, 0, col // or
X_OBJNEWGROUP
// Back Face
X_OBJADDVERTEX -sx,  sy, -sz, 1, 0, col // or
X_OBJADDVERTEX -sx, -sy, -sz, 1, 1, col // ur
X_OBJADDVERTEX  sx,  sy, -sz, 0, 0, col // ol
X_OBJADDVERTEX  sx, -sy, -sz, 0, 1, col // ul
X_OBJNEWGROUP
// Top Face
X_OBJADDVERTEX -sx,  sy,  sz, 1, 0, col // or
X_OBJADDVERTEX -sx,  sy, -sz, 1, 1, col // ur
X_OBJADDVERTEX  sx,  sy,  sz, 0, 0, col // ol
X_OBJADDVERTEX  sx,  sy, -sz, 0, 1, col // ul
X_OBJNEWGROUP
// Bottom Face
X_OBJADDVERTEX  sx, -sy, -sz, 0, 0, col // ol
X_OBJADDVERTEX -sx, -sy, -sz, 1, 0, col // or
X_OBJADDVERTEX  sx, -sy,  sz, 0, 1, col // ul
X_OBJADDVERTEX -sx, -sy,  sz, 1, 1, col // ur
X_OBJNEWGROUP
// Right face
X_OBJADDVERTEX  sx,  sy, -sz, 1, 0, col // or
X_OBJADDVERTEX  sx, -sy, -sz, 1, 1, col // ur
X_OBJADDVERTEX  sx,  sy,  sz, 0, 0, col // ol
X_OBJADDVERTEX  sx, -sy,  sz, 0, 1, col // ul
X_OBJNEWGROUP
// Left Face
X_OBJADDVERTEX -sx, -sy,  sz, 1, 1, col // ur
X_OBJADDVERTEX -sx, -sy, -sz, 0, 1, col // or
X_OBJADDVERTEX -sx,  sy,  sz, 1, 0, col // ul
X_OBJADDVERTEX -sx,  sy, -sz, 0, 0, col // ol
X_OBJNEWGROUP
X_OBJEND
IF sx=sy AND sx=sz
t.name$="cube, s="+FORMAT$(0,1,sz*2)
ELSE
t.name$="cuboid, "+FORMAT$(0,1,sx*2)+"x"+FORMAT$(0,1,sy*2)+"x"+FORMAT$(0,1,sz*2)
ENDIF
RETURN EntityAddInternal(t)

ENDFUNCTION // sz
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

Kitty Hello

Quote from: Schranz0r on 2008-Jun-28
Bei EntityCollisionSetBox sollte sich die Collisionbox auch mit dem Objekt mitdrehen oder?

Bei box->mesh Kollision sollte das so sein. Bei box->sphere nicht. Das ist etwas doof.
Ich bau nuch sphere->sphere ein, das kann man wirklich gut brauchen, und ist schnell.

x-tra

#221
hast du dir unseren vorschlag wegen den kollisionen durch den kopf gehen lassen?

also standard mesh-mesh kollision, und wenn radius oder box o.ä. gesetzt, wird eben einfach auf diese kollisions"aura" gesetzt, und einfach nur bei kollisionprüfung ein true oder false ausgegeben.

hatte mich ja mit schranz0r zusammen gesetzt, und hielten das für eine gute idee, und einfacher zu handhaben, statt, einzeln festzulegen auf was für kollisionen es prüfen soll.

hier so als beispiel sozusagen

Code (glbasic) Select
EntitySetPosition(bla, 0, 0, 0)
EntityCollisionSetRadius(bla, 1)

EntitySetPosition(blu, 100, 100, 100)
EntityCollisionSetBox(blu, x,y,z,bx,by,bz)

EntityCollision(bla, blu, [reaktion])    reaktion=  0 nichts
                                                             1 stop
                                                             2 sliden


wobei reaktion jetzt kein muss ist, sondern nur eine idee von schranz0r, wichtig wäre sozusagen nur EntityCollision(bla, blu)     return TRUE/FALSE

es werden vorher nur kollisionsaussenhüllen festgelegt, und hinterher einfach geprüft ob diese, egal wie sie definiert sind geprüft.

Kitty Hello

u.U. will man aber das gleiche Objekt auf verschiedene Weisen testen. z.B. box->mesh für die Welt-spieler Kollision, und sphere->sphere für gegner->spieler Kollision.

x-tra

#223
ja aber das ist doch eigentlich irrelevant.


bei EntityCollision(a,b) werden zwei entities auf collision geprüft, nur abhängig vom jeweiligen radius box etc.  wenn man spieler eine radius zugewiesen hat, ist dieser eben kollisionshülle, oder eben eine box, etc.  man gibt einfach nur sozusagen eine neue kollisionsform an.

und man prüft dann intern alles durch.

das praktisch gesehen für den anwender nur noch eine abfrage zwischen zwei entities notwendig wird.

weil man doch eh zwei entities prüft, also z.b. EntityCollision(welt, spieler)  damit wäre das ergebis true oder false, und dann kann man ja entscheiden, was nach einer kollision geschehen soll.

welt wäre eben ein mesh und spieler hätte einen radius, aber dies wäre nur intern wichtig.

jede entity bekommt den standard mesh zugewiesen, oder eben etwas was man selbst festlegt(radius/box/etc.)  und es wird einfach nur entity gegen entiy geprüft, da man ja eh unterschiedlich reagieren muss.

denn wir hatten mit schranz0r auch noch eine andere überlegung, wenn mann diese kollisionen wie bisher festlegt, dann mann man unterschiedliche parameter(box radius) etc. nicht in einen topf stecken, z.b. in eine gruppe  metallische objekte, um dann einen klang abzuspielen, aber das geht ja nicht, wenn dort durcheinander box/radius etc. ist.

frag schranz0r notfalls nochmal, wir hatten uns das eigentlich ziemlich lange überlegt, bzw. es für einfacher befunden.

[edit] alternativ könnte man ja auch bei dem befehl ja noch einen parameter für die unterschiedlichen kollisionsarten angeben, aber erst bei der abfrage der kollision http://www.blitzforum.de/help/Collisions  als beispiel.
ist da insgesamt etwas einfach zu handhaben, aber ich denke die idee die schranzi und ich hatten, wäre schon vorteilhaft.


was ich meine ist...
Code (glbasic) Select
// ------------------------------------------ //
//! Add collision request for the next EntityUpdateCollisions
//! calls.
// \param group_src      - source group to test collisions against
// \param group_dest     - destination group to test aginst
// \param collision_mode - 0=sphere-mesh, 1=box-mesh, 2=sphere-box
// \sa EntityUpdateCollisions, EntityClearCollisions, EntitySetGroup


es wird mit 0,1,2 EINE Kollisionsart festgelegt.

oder denk ich da jetzt zu umständlich?

wenn du das so, wie es jetzt ist für einfacher und vollständiger hältst, mach mal ein beispiel, was aussagekräftiger ist.
so müsste man ja immer gleiche objekte in eine gruppe packen, man könnte ja gegner mit radius und auch welche mit box haben, dann würde das so nicht funktionieren.

Kann man das nicht doch einfacher machen?


[editedit]
Code (glbasic) Select
LOCAL ncol = EntityCollisionCount(juru)
FOR i = 1 TO ncol
IF EntityCollisionEntity(juru, EntityGetName$(i)) = level THEN collevel = 1
NEXT       
       IF collevel = 1
          updown = 0.01
          IF KEY(57) THEN updown=0.5
       ELSE
        updown=updown-0.02
       ENDIF
colllevel=0


ziemlich kompliziert, oder?Ich mein, man muss ja eh hinterher noch festlegen was passieren soll.

nunja, vielleicht fällt dir ja noch was einfacheres ein...

oder red ma mit schranz0r, der hat auch gute ideen...

Kitty Hello

Äh... Aber ich hab das doch analog zu Collisions wie bei Blitz gemacht. Nein?