4.60 beta 2: What's wrong with MoveNode() ?

Just starting out? Need help? Post your questions and find answers here.
User avatar
Comtois
Addict
Addict
Posts: 1431
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

4.60 beta 2: What's wrong with MoveNode() ?

Post by Comtois »

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
;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)
Use the cursor to move the entity, you will see a shift

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
Please correct my english
http://purebasic.developpez.com/
User avatar
Comtois
Addict
Addict
Posts: 1431
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

Re: 4.60 beta 2: What's wrong with MoveNode() ?

Post by Comtois »

Ok now i am sure it's a bug. If I replace Node By Entity, It work fine

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)
  CreateEntity(0, MeshID(0), #PB_Material_None)
  ScaleEntity(0,8*2,2*2,4*2)
  MoveEntity(0,0,14,0) 
  
  
  CreateCube(1, 10)
  CreateEntity(1, MeshID(1), #PB_Material_None)
  ScaleEntity(1,8*2,2*2,4*2)
  MoveEntity(1,0,14,0)
  
  ;-Camera
  CreateCamera(0, 0, 0, 100, 100)
  CameraLocate(0, 0, 400, 350)
  CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(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 "***"
        
        EntityLocate(0, NEW_X(EntityX(0), EntityYaw(0), #PlayerSpeed), EntityY(0), NEW_Z(EntityZ(0), EntityYaw(0), #PlayerSpeed))
        MoveEntity(1, NEW_X(0, EntityYaw(1), #PlayerSpeed), 0, NEW_Z(0, EntityYaw(1), #PlayerSpeed))
        
      ElseIf KeyboardPushed(#PB_Key_Down)
        EntityLocate(0, NEW_X(EntityX(0), EntityYaw(0), -#PlayerSpeed), EntityY(0), NEW_Z(EntityZ(0), EntityYaw(0), -#PlayerSpeed))
        MoveEntity(1, NEW_X(0, EntityYaw(1), -#PlayerSpeed), 0, NEW_Z(0, EntityYaw(1), -#PlayerSpeed))
      EndIf
      If KeyboardPushed(#PB_Key_Left)
        RotateEntity(0,0, -1.2, 0, RotationRel)
        RotateEntity(1,0, -1.2, 0, RotationRel)
      ElseIf KeyboardPushed(#PB_Key_Right)
        RotateEntity(0,0, 1.2 ,0, RotationRel)
        RotateEntity(1,0, 1.2, 0, RotationRel)
      EndIf
      
    EndIf
    CreateLine3D(13, EntityX(0), EntityY(0)+25, EntityZ(0), $0000FF, NEW_X(EntityX(0), EntityYaw(0), 200), EntityY(0)+25, NEW_Z(EntityZ(0), EntityYaw(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, EntityYaw(0) + 180, Pv)
      Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(0), AngleCamera, 100), Pv1)
      Py = CurveValue(CameraY(#Camera), EntityY(0) + 1390, Pv1)
      Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(0), AngleCamera, 100), Pv1)
      
    Case #VueArriere
      AngleCamera = CurveAngle(AngleCamera, EntityYaw(0) + 180, Pv)
      Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(0), AngleCamera, 360), Pv1)
      Py = CurveValue(CameraY(#Camera), EntityY(0) + 150, Pv1)
      Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(0), AngleCamera, 360), Pv1)
      
  EndSelect
  CameraLocate(#Camera, Px, Py, Pz)
  CameraLookAt(#Camera, EntityX(0), EntityY(0), EntityZ(0))
EndProcedure
Please correct my english
http://purebasic.developpez.com/
G-Rom
User
User
Posts: 45
Joined: Sat Mar 19, 2011 3:49 pm
Contact:

Re: 4.60 beta 2: What's wrong with MoveNode() ?

Post by G-Rom »

Fixed.
Post Reply