ich würde sagen fast richtig
#pb_local bewegt immer relativ zur Aktuellen Position und in Blickrichtung des Objects. Absolut würde auch keinen Sinn hier machen.
#pb_parent - wenns an keinen Node hängt, ist es identisch mit den Weltkoordinaten. Wichtig ist hier aber, wenn das Parent "verdreht" ist, dann beachtet das #pb_parent. Es ist also nicht nur die Kordinaten, sondern auch blickrichtung. Bspw. Wenn das Parent nicht nach norden, sondern osten blickt, dann ist ein Schritt vorwärts mit #pb_parent ein schritt nach osten, ein Schritt vorwärts mit #pb_world ein Schritt nach norden!
Aber hier der versprochene Codefetzen:
Code: Alles auswählen
#Move_Direction =#PB_Local
#Move_ParentRelative =#PB_Parent|#PB_Relative
#Move_ParentAbsolute =#PB_Parent|#PB_Absolute
#Move_WorldRelative =#PB_World|#PB_Relative
#Move_WorldAbsolute =#PB_World|#PB_Absolute
Procedure Node_Move(*self.sNode,x.f,y.f,z.f,mode=#Move_ParentRelative)
Select mode
Case #Move_WorldAbsolute
MoveNode(*self\handle,
x- NodeX( *self\handle,#PB_Absolute),
y- NodeY( *self\handle,#PB_Absolute),
z- NodeZ( *self\handle,#PB_Absolute),
#PB_World)
Case #Move_WorldRelative
MoveNode(*self\handle,x,y,z,#PB_World)
Case #Move_Direction
MoveNode(*self\handle,x,y,z,#PB_Local)
Case #Move_ParentAbsolute,#PB_Absolute
MoveNode(*self\handle,x,y,z,#PB_Absolute)
Case #Move_ParentRelative,#PB_Relative
MoveNode(*self\handle,x,y,z,#PB_Relative)
EndSelect
EndProcedure
Procedure Camera_Move(*self.sCamera,x.f,y.f,z.f,mode=#Move_ParentRelative)
;Rotate(pitch.f,yaw.f,roll.f,mode=#PB_Absolute)
Protected ox.f,oy.f,oz.f,ow.f
Select mode
Case #Move_Direction
MoveCamera(*self\handle,x,y,z,#PB_Local)
Case #Move_ParentAbsolute,#PB_Absolute
MoveCamera(*self\handle,x,y,z,#PB_Absolute)
Case #Move_ParentRelative,#PB_Relative
MoveCamera(*self\handle,x,y,z,#PB_Relative)
Case #Move_WorldRelative
FetchOrientation(CameraID(*self\handle),#PB_Relative)
CameraDirection(*self\handle,0.0,0.0,-1.0)
MoveCamera(*self\handle,x,y,z,#PB_Local)
SetOrientation(CameraID(*self\handle),GetX(),GetY(),GetZ(),GetW())
Case #Move_WorldAbsolute
FetchOrientation(CameraID(*self\handle),#PB_Relative)
CameraDirection(*self\handle,0.0,0.0,-1.0)
MoveCamera(*self\handle,
x-CameraX(*self\handle,#PB_Absolute),
y-CameraY(*self\handle,#PB_Absolute),
z-CameraZ(*self\handle,#PB_Absolute),
#PB_Local)
SetOrientation(CameraID(*self\handle),GetX(),GetY(),GetZ(),GetW())
EndSelect
EndProcedure
Der Code ist notwendig, weil es bspw kein #pb_world|#pb_absolut gibt. Es ist immer relativ. Lösen kann man es, indem man die Weltkordinaten abzieht und so das Object wieder "Nullt" und dann in die gewünsche Richtung gehe.
#PB_Local hab ich in "#Move_Direction" umbenannt, weil es imo für mich mehr Sinn ergibt. Man muss sich das wie ein Ferngesteuertes Auto vorstellen, genauso verhält es sich.
#PB_Parent|#pb_absolute bzw #PB_Parent|#pb_relative verhält sich so, wie ich es erwarte.
Eine Besonderheit ist die Camera. Da gibts einfach - aus welchen Gründen auch immer - kein #pb_world. Ich hab das so gelöst, das ich die Kamera wieder "Auf Null/Norden" ausrichte, dann entspricht #pb_local quasi #pb_world|#pb_relative und dann entsprechend bewege und die Kamera wieder zurückdrehe. Da ja kein "RenderWorld()" kommt, merkt der Spieler davon nichts.
Wie gesagt, ich hab geflucht. Ich hab halt festgestellt, das nur #pb_absolute, #pb_relative, #pb_world und #pb_local Sinn machen. Also von kombinieren kann nicht die Rede sein. ich müsste nochmal probieren (keine lust gerade

- aber #pb_parent|#pb_absolute verhält sich wie #pb_parent|#pb_relative. Nur #pb_absolute alleine hat funktioniert und ist dann absolut von #pb_Parent
Ganz komische Geschichte.... Sollte das mal gefixted werden, dann kann ich mit meiner Procedure einfach anpassen und es ist überall dann richtig. Ich bau eh gerade alle PB-Engine3D-Befehle in Klassen um. Von daher, egal was kommt, ich kanns einfach wieder umbiegen
Mein persönliches Highlight aktuell:
https://www.purebasic.com/documentation ... point.html
und
https://www.purebasic.com/documentation ... ition.html
Erstmal schön, das eines ein "Get" an Anfang hat, das andere nicht. Und laut Beschreibung machen beide das gleiche, nur das eine hat mehr Parameter. Erklärt wird allerdings nichts....