CameraFollow(Camera.i, Entity.i, AngleD.f, Height.f, Distance.f, percent.f)
Camera = Le numéro de la caméra
Entity = Le numéro de l'entité
AngleD = L'angle où la caméra sera placée (180 = derrière l'entity, 90 sur le côté gauche, -90 sur le côté droit, etc)
Height = Position en hauteur de la caméra
Distance = distance entre Entity et Camera
percent = pourcentage de l'interpolation
C'est valable pour une entity orientée vers l'axe -Z (fonctionnement par défaut d'ogre), à adapter pour une autre orientation.
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; 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