Seite 1 von 2

Panzerdemo

Verfasst: 30.08.2012 20:00
von Frabbing
Hi,

ich schnuppere grad mal etwas rein in die 3d-Engine und hab gleich schon leichte Verständnisprobleme.
Was müsste ich z.B. am PB-Democode Examples -> 3D -> Demos -> Tank.pb ändern, damit - so wie die Schüsse es ja machen - auch der Panzer und das Panzerrohr die Kisten zur Seite schubsen, und nicht einfach nur hindurch fahren?

:coderselixir:

Re: Panzerdemo

Verfasst: 02.09.2012 15:03
von Frabbing
Gut, dass ich keine kompliziertere Frage gepostet hatte. Da hätte ich unter Umständen ja gar keine Antwort bekommen... :mrgreen:

Re: Panzerdemo

Verfasst: 02.09.2012 15:48
von FosJonas
Eigentlich geht das ganz einfach in dem du dem Tank Entity einfach einen PhysicBody gibst:

Code: Alles auswählen

EntityPhysicBody(1,#PB_Entity_BoxBody)
Allerdings scheint die Kollision nicht geupdated zu werden wen man den Node bewegt, man muss also das Entity selber Bewegen.

Im Englischem Forum habe ich einen Thread gefunden, der wohl genau dieses Problem hat:
http://www.purebasic.fr/english/viewtop ... hilit=node

Die beste möglichkeit wäre also wohl die Nodes zu entfernen, und die Entities Manuell zu bewegen.

Re: Panzerdemo

Verfasst: 02.09.2012 16:43
von DarkDragon
FosJonas hat geschrieben:Im Englischem Forum habe ich einen Thread gefunden, der wohl genau dieses Problem hat:
http://www.purebasic.fr/english/viewtop ... hilit=node
:freak: Fred hat das bereits als gefixed abgestempelt und zwar hier: http://www.purebasic.fr/english/viewtop ... =collision

Re: Panzerdemo

Verfasst: 02.09.2012 20:47
von Frabbing
Danke schonmal! :-)
Die beste möglichkeit wäre also wohl die Nodes zu entfernen, und die Entities Manuell zu bewegen.
Hui, ich fürchte, das übersteigt meine Fähigkeiten. Wie gesagt, hab grad nur mal reingeschnuppert. Wie bewege ich denn die Enities, und was genau sind das und diese Nodes überhaupt? :?

Re: Panzerdemo

Verfasst: 02.09.2012 21:52
von Kiffi
Frabbing hat geschrieben:Hui, ich fürchte, das übersteigt meine Fähigkeiten.
Frabbing hat geschrieben:Gut, dass ich keine kompliziertere Frage gepostet hatte.
geeenau! :mrgreen:

Panzerschubsbefehle gibts erst ab PB Version 12 ;-)

Grüße ... Kiffi

Re: Panzerdemo

Verfasst: 02.09.2012 21:53
von FosJonas
@DarkDragon
Da hast du recht, habe ich wohl etwas voreilig einen anderen Thread herangezogen, es ist nicht das gleiche Problem.
Das Problem das ich meine: Ein Entity das mittels "MoveNode" bewegt wurde kollidiert nicht. Man muss es mittels "MoveEntity" bewegen.

@Frabbing
Wozu Nodes sind kannst du in der Hilfe nachlesen, sind lediglich Container für Objekte wie z.B. Entities.
Mit "manuell bewegen" meinte ich das du eben statt "MoveNode" den Befehl "MoveEntity" benutzt.

Um also den Panzer Kollidieren zu lassen musst du:
Ihm mittels "EntityPhysicBody(1,#PB_Entity_BoxBody)" in Zeile 142 einen Body geben.
Das "AttachNodeObject" in Zeile 211 entfernen, damit er eben nicht mehr durch den Node bewegt wird.
In Zeile 385 das "MoveNode" mit

Code: Alles auswählen

MoveEntity(1,Trans\x*10, Trans\y*10, Trans\z*10) ;Den Panzer bewegen, *10 damit er nicht durch die Gegend schleicht.
NodeLocate(\MainNode,EntityX(1),EntityY(1),EntityZ(1)) ;Damit auch der Rest des Panzer in Position bleibt.
RotateEntity(1, 0, Rot\y, 0, #PB_Relative)     ; Damit der Panzer sich auch weiterhin Dreht.
ersetzen.

Mit diesen änderungen Kollidiert, zumindest bei mir, der Untereteil des Panzer, für den Oberenteil müsste man das ganze dann wiederhohlen.

Re: Panzerdemo

Verfasst: 03.09.2012 06:34
von DarkDragon
FosJonas hat geschrieben:Das Problem das ich meine: Ein Entity das mittels "MoveNode" bewegt wurde kollidiert nicht. Man muss es mittels "MoveEntity" bewegen.
Exakt das Problem wurde von mir in dem Thread beschrieben, den ich nannte (Bug 2). Die "physikalischen" Objekte bewegen sich nicht mit den Nodes.

Re: Panzerdemo

Verfasst: 03.09.2012 12:26
von FosJonas
Jetzt bin ich aber verwirrt, meintest du nicht das, dass gefixt sei?
Um das ganze mal an Hand eines Beispiels zu verdeutlichen:

Code: Alles auswählen

InitEngine3D()
InitSprite()
OpenWindow(0,0,0,800,600,"",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
CreateLight(0,RGB(255,255,255))
CreateCamera(0,0,0,100,100)
CameraLocate(0,16,16,16)
CameraLookAt(0,-5,0,-5)
SetFrameRate(60)

#MoveNode = #True

Enumeration
  #None
  #Node
EndEnumeration

Enumeration
  #None
  #Red
  #Blue
  #Green
EndEnumeration

Enumeration
  #None
  #Cube
EndEnumeration

Enumeration
  #None
  #BoxA
  #BoxB
  #Ground
EndEnumeration

CreateNode(#Node)

CreateTexture(#Red,1,1)
StartDrawing(TextureOutput(#Red))
Plot(0,0,RGB(196,0,0))
StopDrawing()
CreateMaterial(#Red,TextureID(#Red))

CreateTexture(#Green,1,1)
StartDrawing(TextureOutput(#Green))
Plot(0,0,RGB(0,196,0))
StopDrawing()
CreateMaterial(#Green,TextureID(#Green))

CreateTexture(#Blue,1,1)
StartDrawing(TextureOutput(#Blue))
Plot(0,0,RGB(0,0,196))
StopDrawing()
CreateMaterial(#Blue,TextureID(#Blue))

CreateCube(#Cube,1)

CreateEntity(#Ground,MeshID(#Cube),MaterialID(#Blue),-5,-1,-5)
ScaleEntity(#Ground,10,1,10)
EntityPhysicBody(#Ground,#PB_Entity_BoxBody,0)

CreateEntity(#BoxA,MeshID(#Cube),MaterialID(#Red),-5,0,-8)
EntityPhysicBody(#BoxA,#PB_Entity_BoxBody)

CreateEntity(#BoxB,MeshID(#Cube),MaterialID(#Green),-5,0,-2)
EntityPhysicBody(#BoxB,#PB_Entity_BoxBody)

AttachNodeObject(#Node,EntityID(#BoxA))

Repeat
  Event = WaitWindowEvent(1)
  
  If #MoveNode = #True
    MoveNode(#Node,0,0,0.1)
  Else
    MoveEntity(#BoxA,0,0,10)
  EndIf
  
  RenderWorld()
  FlipBuffers()
Until Event = #PB_Event_CloseWindow
Wenn #MoveNode = #True ist, kollidiert das ganze nicht (da es mit MoveNode bewegt wird), wenn #MoveNode = #False ist kollidieren die beiden Cubes (da es nun mittels MoveEntity bewegt wird).
Bei mir ist das ganze also nicht gefixt. Oder habe ich irgendwas falsch verstanden?

Re: Panzerdemo

Verfasst: 03.09.2012 18:24
von Frabbing
FosJonas hat geschrieben: Um also den Panzer Kollidieren zu lassen musst du:
Ihm mittels "EntityPhysicBody(1,#PB_Entity_BoxBody)" in Zeile 142 einen Body geben.
Das "AttachNodeObject" in Zeile 211 entfernen, damit er eben nicht mehr durch den Node bewegt wird.
In Zeile 385 das "MoveNode" mit

Code: Alles auswählen

MoveEntity(1,Trans\x*10, Trans\y*10, Trans\z*10) ;Den Panzer bewegen, *10 damit er nicht durch die Gegend schleicht.
NodeLocate(\MainNode,EntityX(1),EntityY(1),EntityZ(1)) ;Damit auch der Rest des Panzer in Position bleibt.
RotateEntity(1, 0, Rot\y, 0, #PB_Relative)     ; Damit der Panzer sich auch weiterhin Dreht.
ersetzen.

Mit diesen änderungen Kollidiert, zumindest bei mir, der Untereteil des Panzer, für den Oberenteil müsste man das ganze dann wiederhohlen.
Danke, das klappt einwandfrei! :D

Hab das ganze dann mit dem Oberteil und dem Rohr genauso versucht, aber das scheint nicht hinzuhauen. Das Oberteil ist seltsamerweise komplett verschwunden, und das Rohr ist "abgefallen" und wird dann auch vom Unterteil weggeschoben. Hat zwar was, aber ist ja so nicht gewollt. Kannst du dir das nochmal ansehen, ob doch noch Weiteres zu beachten ist?