3D Entity System [DE]

Previous topic - Next topic

x-tra

das ist mir schon klar, aber ich will das Entity System voranbringen, da bei BB M.Silby schon wieder am werkeln ist, und das ES langsam aber sicher in glb reingehört.

Schranz0r

Ja der Marc Silby schiesst sich mal wieder ein Eigentor.... Noch eine Engine, noch weniger support, noch mehr Ärger in den Foren!
Deshalb bin ich auch gegen eine weitere Unterstüzung von GLB mit Handhelds...
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

#152
jaja der mark, naja egal back2topic.

ich habe mal was probiert:
Code (glbasic) Select
// ------------------------------------------ //
//! Return the pitch(x) angle of the entity
// \param entity - handle to the entity
// \return the pitch angle for that entity.
// ------------------------------------------ //
FUNCTION EntityPitch: Entity
    RETURN g3DObj[Entity].rx
ENDFUNCTION

// ------------------------------------------ //
//! Return the yaw(y) angle of the entity
// \param entity - handle to the entity
// \return the yaw angle for that entity.
// ------------------------------------------ //
FUNCTION EntityYaw: Entity
    RETURN g3DObj[Entity].ry
ENDFUNCTION

// ------------------------------------------ //
//! Return the roll(z) angle of the entity
// \param entity - handle to the entity
// \return the roll angle for that entity.
// ------------------------------------------ //
FUNCTION EntityRoll: Entity
    RETURN g3DObj[Entity].rz
ENDFUNCTION


müsste doch richtig sein, oder?

vielleicht find ich noch raus wie das mit dem pivot funktioniert.


und vielleicht so?

Code (glbasic) Select
FUNCTION CreatePivot:
LOCAL t AS T3DEntity
t.what = 0
RETURN EntityAddInternal(t)
ENDFUNCTION


und hey das funktioniert mit diesem, wenn auch unschönen code sogar.

Code (glbasic) Select
// --------------------------------- //
// Project: game
// Start: Thursday, June 05, 2008
// IDE Version: 5.254
//SETSCREEN 600, 600, 0
//LIMITFPS 60


camera=EntityCreateCamera()
EntityEnable(camera, TRUE)


light = EntityCreateCelShadingLight()
boden = EntityLoadMesh ("boden.ddd")
figur = EntityLoadMesh ("figur.ddd")

terrain_texture = EntityLoadTexture("world01.bmp")
EntityApplyTexture(boden, terrain_texture, EntityMakeNullTexture() )

EntityPosition(boden, 0, 0, 0)
EntityMove(boden, 0, -3.5, 0)
EntityPosition(figur, 0, 0, 0)
sc = 10
EntityScale(boden, sc,sc,sc)
EntityParent(camera, figur)
EntityPosition(camera, 0, 5, 100)
EntityRotate(camera, 0,90,0)
EntityParent(light, camera)
pivot = CreatePivot()
EntityParent(figur, pivot)
WHILE TRUE
// Ship Control
IF KEY(203)
EntityRotate(pivot, 0, 5, 0)
ENDIF

IF KEY(205)
EntityRotate(pivot, 0, -5, 0)
ENDIF

IF KEY(200) THEN EntityMove(pivot, 0, 0, -1)
IF KEY(208) THEN EntityMove(pivot, 0, 0,  1)

EntityDrawSystem()
SHOWSCREEN

WEND


Schranz0r

hehe ne

Das musst du mit Push- und Popmatrix machen :)
Oder Matrizen multiplizieren
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

#154
wegen dem pivot?


funktioniert aber...

nicht einwandfrei, aber der code geht.

weiß nicht ob das beim verschieben des pivots immer noch geht, aber hey, immerhin ein anfang.....

@gernot: keine ahnung ob mein code richtig war, kannst du mal schauen und pivots mit einbauen?bitte

so zum beispiel kann man ein pivot nutzen......die box(spielfigur) kann man frei animieren, bewegen, wie auch immer, die kamera folgt trotzdem einfach weiter.
mein pivot in diesem fall ist einfach eine kugel....
Code (glbasic) Select
sc = 10
camera=EntityCreateCamera()
light = EntityCreateCelShadingLight()
boden = EntityLoadMesh ("boden.ddd")
pivot = EntityLoadMesh ("figur.ddd")
box = EntityLoadMesh ("box1.ddd")
terrain_texture = EntityLoadTexture("world01.bmp")

EntityEnable(camera, TRUE)
EntityApplyTexture(boden, terrain_texture, EntityMakeNullTexture() )
EntityPosition(boden, 0, 0, 0)

EntityScale(boden, sc,sc,sc)
EntityScale(pivot, 20, 20, 20)
EntityScale(box, 2, 2, 2)

EntityPosition(camera, 0, 5, 100)
EntityRotate(camera, 0,90,0)
EntityParent(light, camera)
EntityPosition(pivot, 0, 20, 50)

EntityPosition(box, 0, 0, 50)
EntityParent(box, pivot)
EntityParent(camera, pivot)

WHILE TRUE
// Ship Control
IF KEY(203)

EntityRotate(pivot, 0, 1, 0)
ENDIF

IF KEY(205)

EntityRotate(pivot, 0, -1, 0)
ENDIF

IF KEY(200) THEN EntityMove(pivot, 0, 0, -1)
IF KEY(208) THEN EntityMove(pivot, 0, 0,  1)

EntityDrawSystem()
SHOWSCREEN

WEND





Schranz0r

#155
Pivot's!

Sollte auch mit dem Entity laufen, hoffe ich :D


Code (glbasic) Select

GLOBAL OrigiMat[]
DIM OrigiMat[16]
DIMDATA OrigiMat[],1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1

SYSTEMPOINTER TRUE

TYPE Pivot
ID = -1
Mat[16]
RotOn
rx; ry; rz
ENDTYPE

GLOBAL Piv[] AS Pivot


TYPE Object
ID = -1
Mesh
PivID = -1
Mat[16]
RotOn
rx; ry; rz
ENDTYPE

GLOBAL Obj[] AS Object


CreateCube(1, 5, RGB(255, 255, 255))

LOCAL Piv1 = CreatePivot()

LOCAL Obj1 = CreateObjectOnPosition(1,10,0,0,Piv1)
LOCAL Obj2 = CreateObjectOnPosition(1,0,10,0,Piv1)
LOCAL Obj3 = CreateObjectOnPosition(1,-10,0,0,Piv1)
LOCAL Obj4 = CreateObjectOnPosition(1,0,-10,0,Piv1)


WHILE TRUE
LOCAL mx,my,b1,b2
MOUSESTATE mx, my, b1, b2

X_MAKE3D 1,1000,45
X_CAMERA 0,0,-80, 0,0,0

X_AMBIENT_LT 1, RGB(255,0,0)

X_SCREEN2WORLD mx, my, 0, wx, wy, wz


SetPivotRotation(Piv1,0,0,2)
SetObjectRotation(Obj1,2,0,0)
SetObjectRotation(Obj2,0,2,0)
SetObjectRotation(Obj3,-2,0,0)
SetObjectRotation(Obj4,0,-2,0)

SetPivotPosition(Piv1,wx*80,wy*80,0)

IF b1
SetObjectPosition(Obj1,15,0,0)
ENDIF
IF b2
SetObjectPosition(Obj1,10,0,0)
ENDIF

Update()
SHOWSCREEN
WEND
END


FUNCTION CreatePivot:
LOCAL p AS Pivot
STATIC ID

p.ID = ID
p.Mat[] = OrigiMat[]

DIMPUSH Piv[],p

INC ID,1
RETURN p.ID
ENDFUNCTION

FUNCTION CreateObjectOnPosition: ObjectID, x, y, z, PivotID
LOCAL o AS Object
STATIC ID
o.ID = ID
o.Mesh = ObjectID
o.PivID = PivotID

o.Mat[] = OrigiMat[]
o.Mat[12] = x
o.Mat[13] = y
o.Mat[14] = z
INC ID,1
DIMPUSH Obj[],o
RETURN o.ID
ENDFUNCTION

FUNCTION SetObjectPosition: ObjectID, x, y, z

Obj[ObjectID].Mat[12] = x
Obj[ObjectID].Mat[13] = y
Obj[ObjectID].Mat[14] = z

ENDFUNCTION

FUNCTION SetPivotPosition: PivID, x, y, z

Piv[PivID].Mat[12] = x
Piv[PivID].Mat[13] = y
Piv[PivID].Mat[14] = z

ENDFUNCTION

FUNCTION SetObjectRotation: ObjectID, x, y, z
FOREACH i IN Obj[]
IF i.ID = ObjectID
i.RotOn = TRUE

IF i.rx > 359 THEN i.rx = 0
IF i.ry > 359 THEN i.ry = 0
IF i.rz > 359 THEN i.rz = 0
IF i.rx < 0 THEN i.rx = 359
IF i.ry < 0 THEN i.ry = 359
IF i.rz < 0 THEN i.rz = 359

INC i.rx, x
INC i.ry, y
INC i.rz, z

ENDIF
NEXT
ENDFUNCTION

FUNCTION SetPivotRotation: PivID, x, y, z
FOREACH i IN Piv[]
IF i.ID = PivID
i.RotOn = TRUE

IF i.rx > 359 THEN i.rx = 0
IF i.ry > 359 THEN i.ry = 0
IF i.rz > 359 THEN i.rz = 0
IF i.rx < 0 THEN i.rx = 359
IF i.ry < 0 THEN i.ry = 359
IF i.rz < 0 THEN i.rz = 359

INC i.rx, x
INC i.ry, y
INC i.rz, z
ENDIF
NEXT
ENDFUNCTION

FUNCTION Update:

FOREACH i IN Obj[]



X_MOVEMENT Piv[i.PivID].Mat[12], Piv[i.PivID].Mat[13], Piv[i.PivID].Mat[14]

          IF Piv[i.PivID].RotOn = TRUE
          IF Piv[i.PivID].rx > 0
          X_ROTATION Piv[i.PivID].rx,1, 0, 0
          ENDIF
          IF Piv[i.PivID].ry > 0
          X_ROTATION Piv[i.PivID].ry,0, 1, 0
          ENDIF
          IF Piv[i.PivID].rz > 0
          X_ROTATION Piv[i.PivID].rz, 0, 0, 1
          ENDIF
      ENDIF
       
X_PUSHMATRIX
          X_MOVEMENT i.Mat[12], i.Mat[13], i.Mat[14]
          IF i.RotOn = TRUE
          IF i.rx > 0
          X_ROTATION i.rx,1, 0, 0
          ENDIF
          IF i.ry > 0
          X_ROTATION i.ry,0, 1, 0
          ENDIF
          IF i.rz > 0
          X_ROTATION i.rz, 0, 0, 1
          ENDIF
      ENDIF
          X_DRAWOBJ i.Mesh, 0
    X_POPMATRIX

NEXT
ENDFUNCTION

FUNCTION CreateCube: num, sz, col
// Diese Variablen sind als LOCAL definiert:
// num, sz,
X_AUTONORMALS 1 // For a cube, hard edges
sz=sz/2
X_OBJSTART num
// Front Face
X_OBJADDVERTEX  sz, -sz,  sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz,  sz, 0, 0, col
X_OBJADDVERTEX  sz,  sz,  sz, 1, 1, col
X_OBJADDVERTEX -sz,  sz,  sz, 0, 1, col
X_OBJNEWGROUP
// Back Face
X_OBJADDVERTEX -sz,  sz, -sz, 1, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX  sz,  sz, -sz, 0, 1, col
X_OBJADDVERTEX  sz, -sz, -sz, 0, 0, col
X_OBJNEWGROUP
// Top Face
X_OBJADDVERTEX -sz,  sz,  sz, 0, 0, col
X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
X_OBJADDVERTEX  sz,  sz,  sz, 1, 0, col
X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
X_OBJNEWGROUP
// Bottom Face
X_OBJADDVERTEX  sz, -sz, -sz, 0, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
X_OBJNEWGROUP
// Right face
X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
X_OBJADDVERTEX  sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX  sz,  sz,  sz, 0, 1, col
X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
X_OBJNEWGROUP
// Left Face
X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, col
X_OBJADDVERTEX -sz,  sz,  sz, 1, 1, col
X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
X_OBJNEWGROUP
X_OBJEND

ENDFUNCTION // sz




Erklärung:

  • Erst ein Mesh/Object laden
  • CreatePivot() erstellt einen Pivot auf der Position 0,0,0 und als rückgabe die PivotID
  • CreateObjectOnPosition( MeshID, x,y,z, PivotID ) rückgabe ObjectID
  • SetPivotRotation(PivotID, rotation_x, rotation_y, rotation_z)
  • SetObjectRotation(ObjectID, rotation_x, rotation_y, rotation_z)
  • SetPivotPosition(PivotID, x, y, z)
  • SetObjectPosition(ObjectID, x, y, z)
  • Update() zeichnet alles auf den Bildschirm und Updatet alle Positionen :)
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

#156
damit kann ich grad nicht wirklich viel anfangen....

ich hab im letzten teil die funktionen mal an das ES angehangen, aber die pivots beziehen sich ja nicht auf das ES.

mmmm was kann ich tun, um es komplett in das aktuelle ES von der ersten threadseite einzubauen?

und es kollidiert glaube ich bei  CreateObjectOnPosition

achja, die einzelnen befehle bzw. funktionen, nicht alle sind mir klar, wozu die gut sind....

is schon spät heut.


[edit] ein createpivot, wo man in klammern bei bedarf dieses pivot gleich zuordnen kann(net so wichtig) wäre schon ausreichend.nur muss man es eben auch normal als entity ansprechen können.

Kannst du mir so eine createpivotfunktion für das ES machen, also ein createpivot, welches als entity angesprochen werden kann, wäre super.wäre dann eben keine ID, sondern das handle, oder?und würde mit entityaddinternal(oder so) hinzugefügt.

da könnt ich heut noch bisschen weitermachen.

Schranz0r

Kannste doch jetzt schön umbauen, für das ES :)
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

#158
Code (glbasic) Select
FUNCTION CreatePivot: x, y, z
LOCAL t AS T3DEntity


p.Mat[] = OrigiMat[]

DIMPUSH Piv[],p


RETURN EntityAddInternal(t)
ENDFUNCTION


soweit hab ichs, aber ich kenn mich mit dem rest da nicht aus......

t.what = .ddd/camera/light   muss ja auch irgendwie rein.


ich bekomms net hin, ich hab es via

Code (glbasic) Select
FOREACH o IN g3DObj[]
IF o.what=3
 
 
  X_PUSHMATRIX
X_MULTMATRIX o.Mg[]
X_POPMATRIX
ENDIF
NEXT


und
Code (glbasic) Select
FUNCTION CreatePivot:
LOCAL t AS T3DEntity
     t.what = 3
RETURN EntityAddInternal(t)
ENDFUNCTION


versucht, hab nen pivot erhalten, der sich nicht verschieben läßt und völlig falsche objekte bewegen läßt.
ich raffs net

Kitty Hello

Nein, die Hilfe mach ich anders. Eine Text-Datei reicht mir dazu.
Aber, bitte erstmal testen und damit arbeiten.

x-tra

#160
Kannst du das System um Pivots erweitern, ich bräuchte die dringend.
So mit positionierung einer jeden pivotentität auf 0,0,0 vielleicht mit objektzuweisung bei bedarf(oder später als parent, und so halt).

oder eben nur ein createpivot auf 0,0,0 und man kann dies dann normal als entity ansprechen.

wäre supercool...

BumbleBee

Wenn ich mal was damit machen sollte, dann weiß ich ja wen ich dann fragen kann. :)
:offtopic:
Was machst du denn eigentlich für ein Spiel wenn du dich schon so fleißig damit befasst? Bin neugierig. :)

Cheers
The day will come...

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

x-tra

#162
ein knuffiges Jump´n Run solls werden, a´la Rayman oder so.

:offtopic: wenn ich auch mal helfen kann, natürlich gern, sonst frage ich ja nur. :rolleyes:

Pivot: Pivot, ist ein Punkt(Vektor?!?) im 3D Raum.
        Sein körper hat keine ausweitung,
        Aber eine Position und eine Ausrichtung.
        Ein Pivot, ist ein Hilfspunkt.

Kitty Hello

In diesem Fall ist der Pivot ein "Referenzpunkt", also ein relativer Drehpunkt des Objekts.

Schranz0r

Genau das Gernot

In der Matrix kann man den Origin ja nicht verschieben oder, dass der Drehpunkt ausserhalb der Mitte liegt, wenn man das Model so gebastelt hat, dass der Origin im mittelpunkt liegt?
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