Anyway, they should always be at the same position. The calculations seem correct
Use the cursor to move the entity, you will see a shift;Debug StrF(-NodeX(0)+NEW_X(NodeX(0), NodeYaw(0), #PlayerSpeed),2) + " / " + StrF(NEW_X(0, NodeYaw(1), #PlayerSpeed),2)
;Debug StrF(-NodeZ(0)+NEW_Z(NodeZ(0), NodeYaw(0), #PlayerSpeed),2) + " / " + StrF(NEW_Z(0, NodeYaw(1), #PlayerSpeed),2)
Code: Select all
#PB_Engine_Space_Local=1
#PB_Engine_Space_Parent=2
#PB_Engine_Space_World=4
#PB_Engine_Absolute_Rotation=8
#PB_Engine_Relative_Rotation=16
#PB_Engine_Quaternion_Rotation=32
#PB_Engine_Euler_Rotation=64
Global RotationAbs = #PB_Engine_Euler_Rotation | #PB_Engine_Absolute_Rotation
Global RotationRel = #PB_Engine_Euler_Rotation | #PB_Engine_Relative_Rotation
#PlayerSpeed = 4
#Camera = 0
Enumeration
#VueArriere
#VueDessus
EndEnumeration
Macro NEW_X(x, Angle, Distance)
((x) + Cos(Radian(Angle)) * (Distance))
EndMacro
Macro NEW_Z(z, Angle, Distance)
((z) + Sin(Radian(Angle)) * (Distance))
EndMacro
Define.f KeyX, KeyY, MouseX, MouseY
Declare GestionCamera(Mode.l)
If InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "char")
WorldShadows(#PB_Shadow_Modulative)
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)
;-Create Sol
Sol = CreatePlane(#PB_Any, 100, 100, 20, 20, 20, 20)
;CreateMaterial(5, LoadTexture(5, "GreenSkin.jpg"))
CreateEntity (5, MeshID(Sol), #PB_Material_None)
EntityRenderMode(5, 0) ; Disable shadow casting for this entity as it's our plan
;ScaleEntity(5, 2000, 1, 2000)
; MoveEntity(5, -1000, -1, -1000)
EntityPhysicBody(5, #PB_Entity_StaticBody)
;-Corps
CreateCube(0, 10)
CreateNode(0)
CreateEntity(0, MeshID(0), #PB_Material_None)
ScaleEntity(0,8*2,2*2,4*2)
;RotateEntity(0,0,90,0)
AttachNodeObject(0,EntityID(0),#PB_Node_Entity)
MoveNode(0,0,14,0)
CreateCube(1, 10)
CreateNode(1)
CreateEntity(1, MeshID(1), #PB_Material_None)
ScaleEntity(1,8*2,2*2,4*2)
;RotateEntity(0,0,90,0)
AttachNodeObject(1,EntityID(1),#PB_Node_Entity)
MoveNode(1,0,14,0)
;-Camera
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0, 0, 400, 350)
CameraLookAt(0,NodeX(0),NodeY(0),NodeZ(0))
;-Light
CreateLight(0,RGB(255,255,255),100,500,0)
AmbientColor(RGB(0,0,0))
;Visualise les axes du monde 3D
CreateLine3D(10, 0, 20, 0, $FF0000, 1000, 20, 0, $FF0000)
CreateLine3D(11, 0, 20, 0, $00FF00, 0, 20, 1000, $00FF00)
CreateLine3D(12, 0, 20, 0, $0000FF, 0, 1020, 0, $0000FF)
Repeat
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
Mode=#VueArriere
ElseIf KeyboardReleased(#PB_Key_F2)
Mode=#VueDessus
EndIf
If KeyboardPushed(#PB_Key_Up)
;Debug StrF(-NodeX(0)+NEW_X(NodeX(0), NodeYaw(0), #PlayerSpeed),2) + " / " + StrF(NEW_X(0, NodeYaw(1), #PlayerSpeed),2)
;Debug StrF(-NodeZ(0)+NEW_Z(NodeZ(0), NodeYaw(0), #PlayerSpeed),2) + " / " + StrF(NEW_Z(0, NodeYaw(1), #PlayerSpeed),2)
;Debug "***"
NodeLocate(0, NEW_X(NodeX(0), NodeYaw(0), #PlayerSpeed), NodeY(0), NEW_Z(NodeZ(0), NodeYaw(0), #PlayerSpeed))
MoveNode(1, NEW_X(0, NodeYaw(1), #PlayerSpeed), 0, NEW_Z(0, NodeYaw(1), #PlayerSpeed))
ElseIf KeyboardPushed(#PB_Key_Down)
NodeLocate(0, NEW_X(NodeX(0), NodeYaw(0), -#PlayerSpeed), NodeY(0), NEW_Z(NodeZ(0), NodeYaw(0), -#PlayerSpeed))
MoveNode(1, NEW_X(0, NodeYaw(1), -#PlayerSpeed), 0, NEW_Z(0, NodeYaw(1), -#PlayerSpeed))
EndIf
If KeyboardPushed(#PB_Key_Left)
RotateNode(0,0, -1.2, 0, RotationRel)
RotateNode(1,0, -1.2, 0, RotationRel)
ElseIf KeyboardPushed(#PB_Key_Right)
RotateNode(0,0, 1.2 ,0, RotationRel)
RotateNode(1,0, 1.2, 0, RotationRel)
EndIf
EndIf
CreateLine3D(13, NodeX(0), NodeY(0)+25, NodeZ(0), $0000FF, NEW_X(NodeX(0), NodeYaw(0), 200), NodeY(0)+25, NEW_Z(NodeZ(0), NodeYaw(0), 200), $0000FF)
GestionCamera(Mode)
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
Else
MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
End
Procedure.f curveValue(actuelle.f, Cible.f, P.f)
If P > 1000.0
P = 1000.0
EndIf
ProcedureReturn (actuelle + ( (Cible - actuelle) * P / 1000.0))
EndProcedure
Procedure.f CurveAngle(oldangle.f,newangle.f, increments.f)
If increments>1
If (oldangle+360)-newangle<newangle-oldangle
oldangle=360+oldangle
EndIf
If (newangle+360)-oldangle<oldangle-newangle
newangle=360+newangle
EndIf
oldangle=oldangle-(oldangle-newangle)/increments
EndIf
If increments<=1
ProcedureReturn newangle
EndIf
ProcedureReturn oldangle
EndProcedure
Procedure GestionCamera(Mode.l)
Define.f Px, Py, Pz, Pv, Pv1
Static AngleCamera.f
Pv = 10
Pv1 = 50
Select Mode
Case #VueDessus
AngleCamera = CurveAngle(AngleCamera, NodeYaw(0) + 180, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(NodeX(0), AngleCamera, 100), Pv1)
Py = CurveValue(CameraY(#Camera), NodeY(0) + 1390, Pv1)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(NodeZ(0), AngleCamera, 100), Pv1)
Case #VueArriere
AngleCamera = CurveAngle(AngleCamera, NodeYaw(0) + 180, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(NodeX(0), AngleCamera, 360), Pv1)
Py = CurveValue(CameraY(#Camera), NodeY(0) + 150, Pv1)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(NodeZ(0), AngleCamera, 360), Pv1)
EndSelect
CameraLocate(#Camera, Px, Py, Pz)
CameraLookAt(#Camera, NodeX(0), NodeY(0), NodeZ(0))
EndProcedure