Page 1 of 1

Example : CameraFollow()

Posted: Wed Jun 26, 2013 9:06 am
by Comtois
here is an example that shows how to easily manage tracking camera

CameraFollow(Camera.i, Entity.i, AngleD.f, Height.f, Distance.f, percent.f)
Camera = Camera's number
Entity = Entity's number
AngleD = Angle where camera should be (180 = Behind entity, 90 on the left, -90 on the right, etc)
Height = Height where camera should be
Distance = distance between Entity and Camera
percent = pourcent interpolation

This is valid for entity-oriented Z- axis, need to be adapted for a different direction.

Code: Select all

;
; ------------------------------------------------------------
;
;   PureBasic - MoveEntity
;
;    (c) 2013 - Fantaisie Software
;
; ------------------------------------------------------------
;

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

#CameraSpeed = 1

#Mesh = 1
#Entity = 1
#Camera = 0

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY, Speed1, Speed2, TimeSinceLastFrame

Declare CameraFollow(Camera.i, Entity.i, AngleD.f, Height.f, Distance.f, percent.f)

If InitEngine3D()
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    ;-Ground
    ;
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 500, 500, 1, 1, 25, 25)
    CreateEntity(0,MeshID(0),MaterialID(0))
    EntityRenderMode(0, 0)
    
    CreateCube(#Mesh, 1)
    
    CreateMaterial(1, LoadTexture(1, "DosCarte.png"))
    
    CreateEntity(#Entity, MeshID(#Mesh), MaterialID(1), 0, 1.5, 0)
    ScaleEntity(#Entity, 1, 3, 1.5)
    
    SkyBox("stevecube.jpg")
    
    CreateCamera(#Camera, 0, 0, 100, 100)
    CameraFollow(#Camera, #Entity, 180, EntityY(#Entity) + 2, 7, 1)
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.5
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.5
      EndIf
      
      Speed1 * 0.9 
      Speed2 * 0.9 
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          Speed2 = 0.01 * TimeSinceLastFrame
        ElseIf KeyboardPushed(#PB_Key_Right)
          Speed2 = -0.01 * TimeSinceLastFrame
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          Speed1 = 0.017 * TimeSinceLastFrame
        ElseIf KeyboardPushed(#PB_Key_Down)
          Speed1 = -0.017 * TimeSinceLastFrame
        EndIf   
        
      EndIf
      
      
      RotateEntity(#Entity, 0, MouseX * TimeSinceLastFrame/100, 0, #PB_Relative)
      MoveEntity(#Entity, Speed2, 0, Speed1, #PB_Local)
      
      CameraFollow(#Camera, #Entity, 180, EntityY(#Entity) + 2, 7, 0.1)
      
      TimeSinceLastFrame = RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End

Procedure Normalize(*V.Vector3)
  Define.f magSq, oneOverMag
  
  magSq = *V\x * *V\x + *V\y * *V\y + *V\z * *V\z
  If magsq > 0
    oneOverMag = 1.0 / Sqr(magSq)
    *V\x * oneOverMag
    *V\y * oneOverMag
    *V\z * oneOverMag
  EndIf 
  
EndProcedure

Procedure Lerp(*R.Vector3, *V1.Vector3, *V2.Vector3, percent.f)
  ;percent = 0 --> R = V1
  ;percent = 1 --> R = V2
  
  If percent<0
    percent=0
  EndIf
  If percent>1
    percent=1
  EndIf 
  *R\x = *V1\x + percent * (*V2\x - *V1\x)
  *R\y = *V1\y + percent * (*V2\y - *V1\y)
  *R\z = *V1\z + percent * (*V2\z - *V1\z)
EndProcedure

Procedure CameraFollow(Camera.i, Entity.i, AngleD.f, Height.f, Distance.f, percent.f)
  Protected.Vector3 P, P1, P2, Angle2
  Static Angle.Vector3
  
  Angle2\x = Sin(Radian(EntityYaw(Entity)+AngleD))
  Angle2\y = 0
  Angle2\z = Cos(Radian(EntityYaw(Entity)+AngleD))
  lerp(@Angle, @Angle, @Angle2, percent)
  Normalize(Angle)
  
  P1\x = CameraX(Camera)
  P1\y = 0
  P1\z = CameraZ(Camera)
  P2\x = EntityX(Entity) + Angle\x * Distance
  P2\y = 0
  P2\z = EntityZ(Entity) + Angle\z * Distance
  Lerp(@P, @P1, @P2, percent)
  
  MoveCamera(Camera, P\x, Height, P\z, #PB_Absolute)
  CameraLookAt(Camera, EntityX(Entity), EntityY(Entity), EntityZ(Entity))   
EndProcedure  

Re: Example : CameraFollow()

Posted: Sat Aug 24, 2013 2:53 am
by Mythros
Hello, Comtois. I am new here, and I just wanted to say. This is one EXCELLENT code I have been looking for in Purebasic for weeks now.

Have a great evening!

Mythros~