Seite 1 von 1

Node bewegt Entitybody's nicht mit

Verfasst: 12.03.2016 01:12
von EddyN
Bei meinem ersten Post im Forum möchte ich sagen dass Purebasic wirklich die beste Investition war die ich je gemacht habe. :allright:
Und möchte mich bei euch allen im Forum bedanken für die exzellente Unterstützung , die es möglich machte seit V3.50 ohne Post's
durch zu kommen!
Und jetzt zu unserm Problem:
Sobald Entity's zu einer Node zusammen geklemmt werden bewegen sich ihre Entitybody's (Physikbody's) nicht mit,
obwohl sie im WorldDebug(#PB_World_DebugBody) Mode eigentlich richtig angezeigt werden.
Für mein Projekt würde es mir unheimlich weiterhelfen wenn das Funktioniert.
Listing ist selbsterklärend (hoffentlich).
Ach so das ganze wurde mit PB5.42 auf Win7 32/64bit getestet.

Code: Alles auswählen

;If we move a Node, the EntityPhysicBody`s do not move :-(

EnableExplicit

InitEngine3D(#PB_Engine3D_DebugLog)
InitKeyboard()
InitSprite()

RandomSeed(0)

Define.i Ende , Count , Ela_Phy_Ti
Define.s Title=Space(40)+"Move the Node with Cursor Keys" , Title_2=""

OpenWindow(0,0,0,460,300,Title,#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
AddWindowTimer(0,1,700)
OpenWindowedScreen(WindowID(0),0,0,460,300,#False,0,0,#PB_Screen_WaitSynchronization)

WorldDebug(#PB_World_DebugBody)

CreateCamera(0,0,0,100,100)
MoveCamera(0,0,4,8)
CameraLookAt(0,0,0,0)

CreateLight(0,$ffffff,-10,50,10)

CreateTexture(0,2,2)
StartDrawing(TextureOutput(0))
Box(0,0,2,2,$FFFFFF)
StopDrawing()

CreateMaterial(0,TextureID(0))
SetMaterialColor(0, #PB_Material_AmbientColor, $FF0000)
SetMaterialColor(0, #PB_Material_DiffuseColor, $FF0000)

CopyMaterial(0, 1)
SetMaterialColor(1, #PB_Material_AmbientColor, $0000FF)
SetMaterialColor(1, #PB_Material_DiffuseColor, $0000FF)


CreateCube(0,1)

CreateEntity(0,MeshID(0),MaterialID(0) ,-2,0,0)
CreateEntity(1,MeshID(0),MaterialID(0) ,2,0,0)

CreateEntityBody(0, #PB_Entity_BoxBody,0,0.01,1)
CreateEntityBody(1, #PB_Entity_BoxBody,0,0.01,1)

CreateNode(0,0,0,0)
AttachNodeObject(0,EntityID(0))
AttachNodeObject(0,EntityID(1))

For Count=2 To 52
  CreateEntity(Count,MeshID(0),MaterialID(1),0,0,0)
  ScaleEntity(Count,0.5,0.5,0.5)
  CreateEntityBody(Count, #PB_Entity_BoxBody,0.1,0.5,1)
  MoveEntity(Count,Random(4)-2,Random(30,3),Random(4)-2,#PB_Absolute)
Next

Repeat
  
  
  ExamineKeyboard()
  
  Repeat 
    Select WindowEvent()
      Case 0 : Break
      Case #PB_Event_CloseWindow : Ende=1   
      Case #PB_Event_Timer : Swap Title,Title_2 : SetWindowTitle(0,Title)
    EndSelect  
  ForEver  
  
  For Count=2 To 52
    If EntityY(Count)<-8
      MoveEntity(Count,Random(4)-2,Random(32)+4,Random(4)-2,#PB_Absolute)
    EndIf
  Next
  
  If KeyboardPushed(#PB_Key_Right)
    RotateNode(0,0,0.06*Ela_Phy_Ti,0,#PB_Relative)
  ElseIf KeyboardPushed(#PB_Key_Left)
    RotateNode(0,0,-0.06*Ela_Phy_Ti,0,#PB_Relative)
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    MoveNode(0,0,0,0.002*Ela_Phy_Ti,#PB_Relative)
  ElseIf KeyboardPushed(#PB_Key_Down)
    MoveNode(0,0,0,-0.002*Ela_Phy_Ti,#PB_Relative)
  EndIf 
  
  Ela_Phy_Ti=RenderWorld(Ela_Phy_Ti)
  
  FlipBuffers()
  
  Delay(1)
  
Until Ende=1 Or KeyboardReleased(#PB_Key_Escape)

Re: Node bewegt Entitybody's nicht mit

Verfasst: 12.03.2016 12:41
von Chimorin
Ich kann das bestätigen. Ein einfaches Verschieben des Entities ohne Node verschiebt auch den Physikkörper, jedoch über eine Node nur das Objekt ohne Physikkörper.

Es wäre gut, wenn du das im englischen Forum posten könntest, nur dort wird auch auf Bugs eingegangen.

Achja, herzlich Willkommen im Forum :)

Re: Node bewegt Entitybody's nicht mit

Verfasst: 12.03.2016 13:11
von STARGÅTE
Nodes sind doch nur Container, wenn du eine physikalische Verbindung haben möchtest musst du auf Joints zurückgreifen.
Wobei es natürlich seltsam ist, dass der physikalische Body woanders zu sein scheint, also die Debug-Ausgabe.

Re: Node bewegt Entitybody's nicht mit

Verfasst: 13.03.2016 13:28
von Chimorin
Nein, es geht hier doch nicht um die physikalische Verbindung.
Für mich sind Nodes Verwaltungsobjekte. Möchte ich einen neuen Nullpunkt setzen, evtl. für mehrere Objekte und diese relativ zu diesem Punkt verschieben oder rotieren, so benutze ich Nodes. Ich wüsste gar nicht, was man mit denen sonst anfangen kann.
MoveEntity() und RotateEntity() funktioniert ja auch mit physikalischen Ents, nur eben nicht über eine weitere Verwaltungsstufe, den Nodes.

Re: Node bewegt Entitybody's nicht mit

Verfasst: 13.03.2016 20:13
von STARGÅTE
Klar, aber in der Physikengine gibt es nur das Weltkoordinatensystem.
Scheinbar wird das Anhängen eines phys. Entitys (absichtlich) irgnoriert, weil Sub-Koordinatensysteme (wie das eines Nodes) nicht unterstützt werden.

Re: Node bewegt Entitybody's nicht mit

Verfasst: 17.03.2016 08:54
von EddyN
Danke Für´s Feedback

@ Chimorin
Bin 100% deiner Meinung

@ STARGÅTE
Jau Nodes sind nur Container, aber bei dem Befehl AttachEntityObject() tritt das selbe Problem auf.
Physikbody wird zwar richtig angezeigt, in “Wirklichkeit“ steht er aber voll nutzlos und unsichtbar in der Gegend herum.
Denke halt dass der Physikbody genau so zum Entity gehört wie seine Textur und sein Schatten..

Mit Joints würde die Sache schon funzen , aber diese Verbindungen sind mir für manche Sachen
einfach nicht starr genug.

Das mit den Sub-Koordinatensystemen könnte natürlich schon sein, (wär aber ma richtig schade)
und würde bedeuten das Node und AttachEntityObject() mit Entitybodys schlicht nicht möglich ist.
Dann wäre da trotzdem noch das falsche anzeigen von WorldDebug(#PB_World_DebugBody).

Re: Node bewegt Entitybody's nicht mit

Verfasst: 24.03.2016 19:11
von Chimorin
Ich habe gerade an einer Idee für ein Workaround gearbeitet und dabei etwas Merkwürdiges festgestellt:
Da der Physikalische Körper nicht aktualisiert wird, lösche ich ihn einfach und erstelle ihn neu. Ich weiß nicht ob die Physikengine ausgehebelt wird (Müsste die sein) oder die Engine an sich, aber auf jeden Fall sind Geschwindigkeiten bis zum Absturz möglich :D

Code: Alles auswählen

;If we move a Node, the EntityPhysicBody`s do not move :-(

EnableExplicit

InitEngine3D(#PB_Engine3D_DebugLog)
InitKeyboard()
InitSprite()

RandomSeed(0)

Define.i Ende , Count , Ela_Phy_Ti
Define.s Title=Space(40)+"Move the Node with Cursor Keys" , Title_2=""


Procedure actual()
  FreeEntityBody(0)
  FreeEntityBody(1)
  CreateEntityBody(0, #PB_Entity_BoxBody,0,0.01,1)
  CreateEntityBody(1, #PB_Entity_BoxBody,0,0.01,1)
EndProcedure


OpenWindow(0,0,0,460,300,Title,#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
AddWindowTimer(0,1,700)
OpenWindowedScreen(WindowID(0),0,0,460,300,#False,0,0,#PB_Screen_WaitSynchronization)

WorldDebug(#PB_World_DebugBody)

CreateCamera(0,0,0,100,100)
MoveCamera(0,0,4,8)
CameraLookAt(0,0,0,0)

CreateLight(0,$ffffff,-10,50,10)

CreateTexture(0,2,2)
StartDrawing(TextureOutput(0))
Box(0,0,2,2,$FFFFFF)
StopDrawing()

CreateMaterial(0,TextureID(0))
SetMaterialColor(0, #PB_Material_AmbientColor, $FF0000)
SetMaterialColor(0, #PB_Material_DiffuseColor, $FF0000)

CopyMaterial(0, 1)
SetMaterialColor(1, #PB_Material_AmbientColor, $0000FF)
SetMaterialColor(1, #PB_Material_DiffuseColor, $0000FF)


CreateCube(0,1)

CreateEntity(0,MeshID(0),MaterialID(0) ,-2,0,0)
CreateEntity(1,MeshID(0),MaterialID(0) ,2,0,0)

CreateEntityBody(0, #PB_Entity_BoxBody,0,0.01,1)
CreateEntityBody(1, #PB_Entity_BoxBody,0,0.01,1)

CreateNode(0,0,0,0)
AttachNodeObject(0,EntityID(0))
AttachNodeObject(0,EntityID(1))

For Count=2 To 52
  CreateEntity(Count,MeshID(0),MaterialID(1),0,0,0)
  ScaleEntity(Count,0.5,0.5,0.5)
  CreateEntityBody(Count, #PB_Entity_BoxBody,0.1,0.5,1)
  MoveEntity(Count,Random(4)-2,Random(30,3),Random(4)-2,#PB_Absolute)
Next

Repeat
  
  
  ExamineKeyboard()
  
  Repeat 
    Select WindowEvent()
      Case 0 : Break
      Case #PB_Event_CloseWindow : Ende=1   
      Case #PB_Event_Timer : Swap Title,Title_2 : SetWindowTitle(0,Title)
    EndSelect  
  ForEver  
  
  For Count=2 To 52
    If EntityY(Count)<-8
      MoveEntity(Count,Random(4)-2,Random(32)+4,Random(4)-2,#PB_Absolute)
    EndIf
  Next
  
  If KeyboardPushed(#PB_Key_Right)
    RotateNode(0,0,0.06*Ela_Phy_Ti,0,#PB_Relative)
    actual()
  ElseIf KeyboardPushed(#PB_Key_Left)
    RotateNode(0,0,-0.06*Ela_Phy_Ti,0,#PB_Relative)
    actual()
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    MoveNode(0,0,0,0.002*Ela_Phy_Ti,#PB_Relative)
    actual()
  ElseIf KeyboardPushed(#PB_Key_Down)
    MoveNode(0,0,0,-0.002*Ela_Phy_Ti,#PB_Relative)
    actual()
  EndIf 
  
  Debug Ela_Phy_Ti
  Ela_Phy_Ti=RenderWorld(Ela_Phy_Ti)
  
  FlipBuffers()
  
  Delay(1)
  
Until Ende=1 Or KeyboardReleased(#PB_Key_Escape)

Re: Node bewegt Entitybody's nicht mit

Verfasst: 31.03.2016 10:16
von EddyN
Ja so geht’s, aber halt nur Paar (79) mal.
Hat aber nix mit der Geschwindigkeit zu tun.
Hab mal auf #PB_Absolute gestellt so ist der Speed korrekt stürzt aber auch nach 79 Schritten ab.
Der Absturz liegt eher bei FreeEntityBody()
Die zwei Befehle kannste auch mal rauswerfen -> auch Absturz nach 79 Schritten.
Und jetzt kommt es ganz dicke!
Änder mal die kranke For Schleife Count=1 to 1 in Count=1 to 60
So kannste dann schon 979 Schritte weit drehen.

Code: Alles auswählen

EnableExplicit

InitEngine3D(#PB_Engine3D_DebugLog)
InitKeyboard()
InitSprite()

RandomSeed(0)


Define.i Ende , Count , Ela_Phy_Ti 
Define.s Title=Space(40)+"Move the Node with Cursor Keys" , Title_2=""
Global Count_2.i

Procedure actual()
  Count_2+1
;   FreeEntityBody(0)
;   FreeEntityBody(1)
  CreateEntityBody(0, #PB_Entity_BoxBody,0,0.01,1)
  CreateEntityBody(1, #PB_Entity_BoxBody,0,0.01,1)
EndProcedure


OpenWindow(0,0,0,460,300,Title,#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
AddWindowTimer(0,1,700)
OpenWindowedScreen(WindowID(0),0,0,460,300,#False,0,0,#PB_Screen_WaitSynchronization)

WorldDebug(#PB_World_DebugBody)

CreateCamera(0,0,0,100,100)
MoveCamera(0,0,4,8)
CameraLookAt(0,0,0,0)

CreateLight(0,$ffffff,-10,50,10)

CreateTexture(0,2,2)
StartDrawing(TextureOutput(0))
Box(0,0,2,2,$FFFFFF)
StopDrawing()

CreateMaterial(0,TextureID(0))
SetMaterialColor(0, #PB_Material_AmbientColor, $FF0000)
SetMaterialColor(0, #PB_Material_DiffuseColor, $FF0000)

CopyMaterial(0, 1)
SetMaterialColor(1, #PB_Material_AmbientColor, $0000FF)
SetMaterialColor(1, #PB_Material_DiffuseColor, $0000FF)


CreateCube(0,1)

CreateEntity(0,MeshID(0),MaterialID(0) ,-2,0,0)
CreateEntity(1,MeshID(0),MaterialID(0) ,2,0,0)


For Count=1 To 60  ; to 60
CreateEntityBody(0, #PB_Entity_BoxBody,0,0.01,1)
CreateEntityBody(1, #PB_Entity_BoxBody,0,0.01,1)
Next

CreateNode(0,0,0,0)
AttachNodeObject(0,EntityID(0))
AttachNodeObject(0,EntityID(1))



For Count=2 To 52
  CreateEntity(Count,MeshID(0),MaterialID(1),0,0,0)
  ScaleEntity(Count,0.5,0.5,0.5)
  CreateEntityBody(Count, #PB_Entity_BoxBody,0.1,0.5,1)
  MoveEntity(Count,Random(4)-2,Random(30,3),Random(4)-2,#PB_Absolute)
Next

Repeat
  
  
  ExamineKeyboard()
  
  Repeat 
    Select WindowEvent()
      Case 0 : Break
      Case #PB_Event_CloseWindow : Ende=1   
      Case #PB_Event_Timer : Swap Title,Title_2 : SetWindowTitle(0,Title)
    EndSelect  
  ForEver  
  
  For Count=2 To 52
    If EntityY(Count)<-8
      MoveEntity(Count,Random(4)-2,Random(32)+4,Random(4)-2,#PB_Absolute)
    EndIf
  Next
  
  If KeyboardPushed(#PB_Key_Right)
    RotateNode(0,0,0.06*Ela_Phy_Ti,0,#PB_Absolute)
    actual()
  ElseIf KeyboardPushed(#PB_Key_Left)
    RotateNode(0,0,-0.06*Ela_Phy_Ti,0,#PB_Absolute)
    actual()
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    MoveNode(0,0,0,-0.002*Ela_Phy_Ti,#PB_Absolute)
    actual()
  ElseIf KeyboardPushed(#PB_Key_Down)
    MoveNode(0,0,0,0.002*Ela_Phy_Ti,#PB_Absolute)
    actual()
  EndIf 
  
  Debug Count_2
  
  Ela_Phy_Ti=RenderWorld(Ela_Phy_Ti)
  
  FlipBuffers()
  
  Delay(1)
  
Until Ende=1 Or KeyboardReleased(#PB_Key_Escape)