3D Entity System [DE]

Previous topic - Next topic

Sebastian

Ich glaube er meinte eher:

"achja, man kann ja auch nur eine (1!!!!!) textur für so ein ddd nehmen, richtig?"

Sprich: "Was ist mit Multitexturing?"

Antwort: Ohne Multitextur Shader (siehe Gernots Thread hier bei den 3D Snippets) nur eine Textur, ja.

Schranz0r

War übrigends mein Shader was da Gernot benutzt hat :D
Ja ihr hört richtig!
Selbst abgeschrieben :D
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

Heiko

ich hab da jetzt grad mit meinen kollisionen zu tun, die sind nämlich noch nicht fertig, hatte keine so richtige muße wegen dem animationsdesaster.
egal, schaut es euch mal an, hoffe ist nicht zu komplex.
und zwar war mein code zwar erst mit einem extra pivot, hab aber jetzt direkt die spielfigur(juru) zum kollidieren mit einer box genommen.
die box is auch nur derweil da, als beispiel halt.
ich speicher zwischendurch die koordinaten des spielers, und bei kollision mit der besagten box, soll die position auf die vorhergehenden werte gesetzt werden.
ich weiß, is nur ein kleiner fehler meinerseits wahrscheinlich, aber dat funktioniert nicht so ganz.
kollisionstyp hab ich sphere-mesh gelassen, müsste ja funktionieren, denk ich mal.
tuts aber nicht, ich kann in die box laufen, aaaber wenn ich in der box springe, kommt es erst zu einer kollision, die dann extrem ausartet, aber schaut selbst.
hier der code, und nebendran das beispiel.
Code (glbasic) Select
LOCAL gplayer = 101
LOCAL ground = 102


light = EntityCreateLight(RGB(255,255,255) )
camera=EntityCreateCamera()
          EntitySetCameraRange(camera,1,1000)

level = EntityLoadMesh("level.ddd")
     leveltex=EntityLoadTexture("level.bmp")
          EntityApplyTexture(level, leveltex, -1 )
                   EntitySetGroup(level, ground)

juru = EntityLoadMesh("juru.ddd")
     jurutex=EntityLoadTexture("juru.bmp")
          EntityApplyTexture(juru, jurutex, -1 )
           EntitySetGroup(juru, gplayer)

box = EntityCreateCube(5)
           EntitySetGroup(box, ground)

stamm = EntityLoadMesh("stamm.ddd")
     stammtex = EntityLoadTexture("stamm.bmp")
          EntityApplyTexture(stamm, stammtex, -1)

pivotfuss = EntityCreatePivot()
              EntityCollisionSetRadius(pivotfuss, 1)
                 EntitySetGroup(pivotfuss, gplayer)

                 

EntitySetPosition(pivotfuss, 0, 1, 0)
EntitySetPosition(level, 0, 0, 0)
EntitySetPosition(box, -2, 10, -2)
EntitySetPosition(stamm, 10, 19, 0)
EntitySetPosition(camera, 0, 7, -15)
EntitySetRotation(stamm, 0, 70, 0)
EntitySetPosition(juru, 0, 10, 5)
EntitySetRotation(camera, 15, 0, 0)


EntityParent(pivotfuss, juru)
EntityParent(light, juru)
EntityParent(camera, juru)
EntityTranslate(light, 0, 2, -2)

EntityEnable(camera, TRUE)

//Kollisionsgruppen initialisieren
EntityAddCollision(gplayer, ground, 0)

//
EntityDebug(TRUE)
WHILE TRUE
GOSUB Kollisionen
GOSUB Movement
GOSUB UpdateMovement
EntityDrawSystem()
EntityUpdateCollisions()
X_MAKE2D
PRINT updown, 10, 10
PRINT EntityGetY(juru), 10, 20
SHOWSCREEN
WEND

SUB Kollisionen:
     
             
             LOCAL ncol = EntityCollisionCount(pivotfuss)
              FOR i = 1 TO ncol
                 IF EntityCollisionEntity(pivotfuss, EntityGetName$(i)) = level THEN collevel = 1
               NEXT
              LOCAL ncol = EntityCollisionCount(juru)
              FOR i = 1 TO ncol
                 IF EntityCollisionEntity(juru, EntityGetName$(i)) = box THEN boxcolli = 1
                         
              NEXT
ENDSUB

SUB Movement:
//Sprung
            IF collevel = 1
               updown = 0.01
               collevel=0
             IF KEY(57) THEN updown=0.5
            ELSE
               updown=updown-0.02

            ENDIF



// drehen und bewegen
            IF KEY(203) THEN jy = 1
            IF KEY(205) THEN jy = -1
            IF KEY(200) THEN jz = 0.5
            IF KEY(208) THEN jz = -0.5

ENDSUB


SUB UpdateMovement:
//sidecoll
IF boxcolli = 1
   EntityMove(juru, tempx, 0, tempz)
   side = 0
   ENDIF   

tempx=EntityGetX(juru)
tempz=EntityGetZ(juru)

EntityRotate(juru, 0, jy, 0)
EntityMove(juru, 0, 0, jz)
EntityMove(juru,0,updown,0)
EntityRotate(stamm, 0, 0, 1)
jy=0;jz=0

ENDSUB



und nicht wundern, is bissi spät, wollte meinen ordentlicheren code nicht verwurschteln, deswegen probier ich immer noch an diesem salatcode.
hier einfach runterladen und schauen.
http://www.glbase.de/test.rar

Sebastian

Ok,

1. bitte benutz TABs
2. du musst schon boxcolli wieder auf 0 setzen, wenn du auf eine Kollision reagiert hast  =D
3. der Code funktioniert immer noch nicht astrein, Kollision funktioniert auch nur beim Springen. Ich hasse das Entity System  :whistle:

Code (glbasic) Select
GLOBAL boxcolli,collevel,camera,level,leveltex,juru,jurutex
GLOBAL box,stamm,stammtex,pivotfuss,updown,jy,jz,tempx,tempz
GLOBAL side,light,shader,glob,only_shadow,tempy

LOCAL gplayer = 101
LOCAL ground = 102

light = EntityCreateLight(RGB(255,255,255) )
camera = EntityCreateCamera()
EntitySetCameraRange(camera,1,1000)

level = EntityLoadMesh("level.ddd")
leveltex = EntityLoadTexture("level.bmp")
EntityApplyTexture(level, leveltex, -1 )
EntitySetGroup(level, ground)

juru = EntityLoadMesh("juru.ddd")
jurutex = EntityLoadTexture("juru.bmp")
EntityApplyTexture(juru, jurutex, -1 )
EntitySetGroup(juru, gplayer)

box = EntityCreateCube(5)
EntitySetGroup(box, ground)

stamm = EntityLoadMesh("stamm.ddd")
stammtex = EntityLoadTexture("stamm.bmp")
EntityApplyTexture(stamm, stammtex, -1)

pivotfuss = EntityCreatePivot()
EntityCollisionSetRadius(pivotfuss, 1)
EntitySetGroup(pivotfuss, gplayer)

EntitySetPosition(pivotfuss, 0, 1, 0)
EntitySetPosition(level, 0, 0, 0)
EntitySetPosition(box, -2, 10, -2)
EntitySetPosition(stamm, 10, 19, 0)
EntitySetPosition(camera, 0, 7, -15)
EntitySetRotation(stamm, 0, 70, 0)
EntitySetPosition(juru, 0, 10, 5)
EntitySetRotation(camera, 15, 0, 0)
EntityParent(pivotfuss, juru)
EntityParent(light, juru)
EntityParent(camera, juru)
EntityTranslate(light, 0, 2, -2)
EntityEnable(camera, TRUE)
EntityAddCollision(gplayer, ground, 0)
EntityDebug(TRUE)
LOADFONT "smallfont.png",0
WHILE TRUE
Movement()
Kollisionen()
UpdateMovement()
EntityDrawSystem()
EntityUpdateCollisions()
X_MAKE2D
SETFONT 0
PRINT updown, 10, 10
PRINT EntityGetY(juru), 10, 20
SHOWSCREEN
WEND

FUNCTION Kollisionen:
LOCAL ncol,i

ncol = EntityCollisionCount(pivotfuss)
FOR i = 0 TO ncol
IF EntityCollisionEntity(pivotfuss, EntityGetName$(i)) = level THEN collevel = 1
NEXT

ncol = EntityCollisionCount(juru)
    FOR i = 0 TO ncol
    IF EntityCollisionEntity(juru, EntityGetName$(i)) = box THEN boxcolli = 1
    NEXT
ENDFUNCTION

FUNCTION Movement:
IF collevel = 1
updown = 0.01
collevel=0
IF KEY(57) THEN updown=0.5
ELSE
updown=updown-0.02
ENDIF

IF KEY(203) THEN jy = 1
IF KEY(205) THEN jy = -1
IF KEY(200) THEN jz = 0.5
IF KEY(208) THEN jz = -0.5
ENDFUNCTION

FUNCTION UpdateMovement:
IF boxcolli = 1
EntityMove(juru, tempx, 0, tempz)
boxcolli = 0
side = 0
ELSE
tempx = EntityGetX(juru)
tempy = EntityGetY(juru)
tempz = EntityGetZ(juru)
EntityRotate(juru, 0, jy, 0)
EntityMove(juru, 0, 0, jz)
EntityMove(juru,0,updown,0)
EntityRotate(stamm, 0, 0, 1)
jy=0;jz=0
ENDIF
ENDFUNCTION

Heiko

#274
[edit] zum thema 1 textur.beispiel, ein level aus verschiedenen modellen, mit mehreren texturen/materialien als eine .3ds datei.wird nich nach .ddd gehen, oder?

ja boxcolli hatte ich auf null gesetzt, hatte nur vorhin das ganze umbenannt, und das vergessen
und du musst zuerst kollisionen ausführen und dann den rest.
dann flackert es nicht so stark.

da flackern bekomm ich immer noch nicht völlig weg, vielleicht findet jemand anderes eine lösung um die kollisionen mit dem sprung und der restlichen bewegung zu verknüpfen, ohne das es flackert.

naja und bei den kollisionen, das muss sich dann wohl mal gernot ansehen, is sicher nen klacks für ihn

@gernot: mein lieber lieber gernot, kannst du eventuell bei den kollisionen noch irgendwie eine reaktion auf eine kollision einbauen?
             so einen stop oder sliding parameter bei kollision.
             wäre sehr hilfreich, da hätte man das problem mit dem ruckeln bei kollisionen mit dem boden und der schwerkraft, sowie der
             noch dranhängenden sprungroutine nicht.
             also "stop" wäre cool für den anfang

vielleicht gleich bei addcollision mit rein, also
Code (glbasic) Select
EntityAddCollision: group_src, group_dest, collision_mode, reaction
0= nichts (oder reaction optional machen)
1= stop
usw.

Kitty Hello

Fehler 1+2:
EntityCollisionEntity
// \param icollision - index of the collision. Must be in range 0..EntityCollisionCount()-1

Code (glbasic) Select

   FOR i = 0 TO ncol-1
      IF EntityCollisionEntity(pivotfuss, i) = level THEN collevel = 1
   NEXT
   ... den unteren selbst machen


Der EntityGetName$ ist nur dazu da, dass Du den irgendwo inschreiben kannst.

Irgendwas stimmt trotzdem noch nicht...





Heiko

ja eben, irgendwas stimmt nicht, aber ist so ein reactionsparameter möglich, oder zu kompliziert?

WÄRE KLASSE!

das mit den kollisionen hab ich nu gerafft, bzw. mir richtig angewöhnt, aaaber eben diese boxkollision, bzw. mit einem anderen objekt, naja naja.

bei y schien es ja noch zu gehen, wenn man aber alte posis wiederherstellen will, gibts probleme, naja heut ist ja samstag, vielleicht bekommen wir das ja zusammen heute noch hin.
wär klasse.

Gernot, schaust es dir mal an? Also die Kollisionen brauch ich wirklich.

Kitty Hello

Ja, aber heut und morgen nicht.

Heiko

#278
danke dir, alles klar.
vielleicht irgendeine ahnung, warum das nicht funktioniert mit den kollisionen?
ich bräuchts und da könnt ich ja mal selber auf die suche gehen.


sooooo, erstmal ohne quellcode, was sagt ihr denn zu meinen noch verbesserungswürdigen kollisionen?
muss noch bisschen probieren, aber es funktioniert schonmal zum großteil.

http://www.glbase.de/koll.rar

achja, sprung ist space taste, der rest via cursor tasten...

Heiko

#279
ich muss ma eben doppelt posten, nic dass es sonst jemand übersieht.
brauch halt noch den reactionsparameter bei collision.

achja, hab gestern ein tolles phänomen bei dem ddd exporter für ac3d erlebt.

ein damit erstelltes objekt, bewegte sich eigenständig, ohne jeglichen code dafür, immer in abhängigkeit von der camera.
ich habs nur positioniert, und es blieb nicht statisch, erst der normale 3dconverter hats hinbekommen.

wo wir gleich dabei sind, eventuell irgendwelche ideen, gernot, um die animationen noch zu verfeinern?

achja, bekomm ich irgendwie dieses metallischen effekt auf meine spielfigur?beispsielsweise mitten diesem spheremapping?
aber eben fürs entitysystem?

kann du da mal schnell was machen?

und ich würde noch gern sprites so plazieren wollen, bzw. animieren, dass es ausschaut, als wenn sie in die 3d welt gehören.
also stell dir vor, ich sammel ein item ein, und hätte dann als folge eine spriteanimation an genau dieser stelle.

aber das muss ja von der größe, position etc. auch irgendwie passen.


achja, und hier mal der code für mein beispiel oben.
ist halt noch nicht perfekt, aber ich nehme gern jeden ratschlag entgegen.

Code (glbasic) Select


LOCAL gplayer = 101
LOCAL glevel = 102


light = EntityCreateLight(RGB(255,255,255) )
camera=EntityCreateCamera()
          EntitySetCameraRange(camera,1,1000)

level = EntityLoadMesh("level.ddd")
     leveltex=EntityLoadTexture("level.bmp")
          EntityApplyTexture(level, leveltex, -1 )
                   EntitySetGroup(level, glevel)

juru = EntityLoadMesh("juru.ddd")
     jurutex=EntityLoadTexture("juru.bmp")
          EntityApplyTexture(juru, jurutex, -1 )
           EntityCollisionSetRadius(juru, 2)
           EntitySetGroup(juru, gplayer)

box = EntityCreateCube(7)
           EntitySetGroup(box, glevel)

boxa = EntityCreateCube(10)
           EntitySetGroup(boxa, glevel)

pivotfuss = EntityCreatePivot()
           EntityCollisionSetRadius(pivotfuss, 1)
            EntitySetGroup(pivotfuss, gplayer)

pivotvorn = EntityCreatePivot()
            EntitySetGroup(pivotvorn, gplayer)
            EntityCollisionSetRadius(pivotvorn, 1)

pivothinten = EntityCreatePivot()
              EntitySetGroup(pivothinten, gplayer)
              EntityCollisionSetRadius(pivothinten, 1)


EntitySetPosition(pivotvorn, 0, 1.5, 1)
EntitySetPosition(pivothinten, 0, 1.5, -1)
EntitySetPosition(pivotfuss, 0, 1, 0)
EntitySetPosition(level, 0, 0, 0)
EntitySetPosition(box, -2, 8, -2)
EntitySetPosition(boxa, 4, 8, 2)
EntitySetPosition(camera, 0, 7, -15)
EntitySetPosition(juru, 0, 9, 8)
EntitySetRotation(camera, 15, 0, 0)


EntityParent(pivotvorn, juru)
EntityParent(pivothinten, juru)
EntityParent(pivotfuss, juru)
EntityParent(light, juru)
EntityParent(camera, juru)
EntityTranslate(light, 0, 2, -2)

EntityEnable(camera, TRUE)

//Kollisionsgruppen initialisieren
EntityAddCollision(gplayer, glevel, 0)

//

WHILE TRUE
GOSUB Kollisionen
GOSUB Movement
GOSUB UpdateMovement
EntityDrawSystem()
EntityUpdateCollisions()
SHOWSCREEN
WEND

SUB Kollisionen:

                IF EntityCollisionCount(pivotvorn) > 0 THEN pivvorn = 0.5
                 IF EntityCollisionCount(pivothinten) > 0 THEN pivhin = 0.5
                  IF EntityCollisionCount(pivotfuss) > 0 THEN collevel = 1
ENDSUB

SUB Movement:


//Sprung
            IF collevel = 1
               updown = 0.01
               collevel=0
             IF KEY(57) THEN updown=0.5
            ELSE
               updown=updown-0.02

            ENDIF


// drehen und bewegen
            IF KEY(203) THEN jy = 1
            IF KEY(205) THEN jy = -1
            IF KEY(200) THEN jz = 0.5 - pivvorn
            IF KEY(208) THEN jz = -0.5 + pivhin

ENDSUB


SUB UpdateMovement:


EntityRotate(juru, 0, jy, 0)
EntityMove(juru, 0, 0, jz)
EntityMove(juru,0,updown,0)
jy=0;jz=0;pivvorn=0;pivhin=0

ENDSUB

Hemlos

Nice library Gernot, i think i might be able to use the matrix stuff...maybe a 3d heli flight sim....im going to try it one of these days...

PS. the program that it has, is bugged...i used [ and ] and both make the program crash.
Bing ChatGpt is pretty smart :O

Schranz0r

Hi Gernot!
Hab mir grad nochmal das Entity angeguckt...
Das ist ja jetzt der HAMMER !

Kleiner vorschlag von mir:

Ich mach ein kleines Spielchen( Nix Großes, so ein 1-2 Tagesprojekt ), dann reden wir über die feste Einbindung ?
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


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

Quentin

Es wäre manchmal praktisch, wenn die Objekterzeugung (ddd) vom Entitysystem abgekoppelt wäre. Wenn ich z.B. Laserschüsse erstelle, finde ich es etwas überflüssig, jedesmal einen neuen Kubus oder was auch immer ich dafür nehme, erstellen zu lassen, da die Objekte alle gleich aussehen. Es gibt zwar die Funktion EntityDuplicate, die bedingt jedoch, daß bereits ein entsprechendes Objekt im Entitysystem vorhanden ist. D.h. einen Laserschuss müsste ich immer in petto halten, um ihn bei Bedarf zu duplizieren, müsste ihn in der Zwischenzeit jedoch so verstecken, daß er nicht angezeigt wird.

Für den Eigenbedarf habe ich mir zwei Funktionen gebastelt, mit denen man 3D-Objekte außerhalb des Entity-Systems erstellen und dann im Entity-System einbinden kann.

Code (glbasic) Select

// ------------------------------------------ //
//! Add an object to the Entity system which was made outside the Entity system (e.g. with X_LOADOBJ)
//! You can call EntityGetFreeMesh before to get a free number
// param obj - object number created with X_LOADOBJ or X_OBJSTART..X_OBJEND
// \return the index of the Entity object
// \sa EntityGetFreeMesh
// ------------------------------------------ //
FUNCTION EntityCreateOjbect: obj

LOCAL t AS T3DEntity
LOCAL nc

IF X_NUMFACES(obj) = 0 THEN RETURN -1
t.what = 0
t.tex = -1
t.ddd = obj
RETURN EntityAddInternal(t)

ENDFUNCTION


Diese bindet einfach ein Objekt, daß ich z.B. mit X_LOADOBJ oder X_OBJSTART..X_OBJEND erstellt habe, in das Entitysystem ein. Natürlich benötige ich dazu eine freie Objektnummer. Auch dafür habe ich dann eine eigene Funktion erstellt, die mir die nächste freie Nummer zurückliefert analog EntityGetFreeTexture(ist in den vorhandenen Funktionen immer fest verdrahtet)

Code (glbasic) Select

// ------------------------------------------ //
//! Get a free mesh slot to use for X_LOADOBJ, X_OBJSTART..X_OBJEND
//! or EntityCreateObject
// \return the index of the mesh
// \sa EntityCreateObject
// ------------------------------------------ //
FUNCTION EntityGetFreeMesh:
LOCAL nc
LOCAL obj = 1
// Get free object slot
nc = X_NUMFACES(obj)
WHILE nc > 0
INC obj, 1
nc = X_NUMFACES(obj)
WEND
RETURN obj
ENDFUNCTION


Wäre es evtl. eine Überlegung wert, solche Funktionen in das ES mit einzubinden?