Panzerdemo

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Panzerdemo

Beitrag 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:
Gruß, Frank
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Panzerdemo

Beitrag von Frabbing »

Gut, dass ich keine kompliziertere Frage gepostet hatte. Da hätte ich unter Umständen ja gar keine Antwort bekommen... :mrgreen:
Gruß, Frank
Benutzeravatar
FosJonas
Beiträge: 121
Registriert: 12.11.2008 19:31

Re: Panzerdemo

Beitrag 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.
Purebasic 5.10 | Kubuntu 12.04 (64 bit) | Opera 12.01 | Nvidia GT 9800
Xubuntu 12.04 (64 bit) | Intel HD Graphis (Onboard)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Panzerdemo

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Panzerdemo

Beitrag 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? :?
Gruß, Frank
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Panzerdemo

Beitrag 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
a²+b²=mc²
Benutzeravatar
FosJonas
Beiträge: 121
Registriert: 12.11.2008 19:31

Re: Panzerdemo

Beitrag 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.
Purebasic 5.10 | Kubuntu 12.04 (64 bit) | Opera 12.01 | Nvidia GT 9800
Xubuntu 12.04 (64 bit) | Intel HD Graphis (Onboard)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Panzerdemo

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
FosJonas
Beiträge: 121
Registriert: 12.11.2008 19:31

Re: Panzerdemo

Beitrag 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?
Purebasic 5.10 | Kubuntu 12.04 (64 bit) | Opera 12.01 | Nvidia GT 9800
Xubuntu 12.04 (64 bit) | Intel HD Graphis (Onboard)
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Panzerdemo

Beitrag 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?
Gruß, Frank
Antworten