4.60 beta 2: What's wrong with MoveNode() ?
Posted: Tue Apr 12, 2011 4:54 pm
What i'm doing wrong ? I created 2 entity, They rotate in the same way, And i use Absolute position for Node 0, et Relative position for Node 1.
Anyway, they should always be at the same position. The calculations seem correct
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