Comtois m'a recommandé de poser mes question sur ce forum, et il a bien raison, il a l'air sympa ce forum

Bon, pour rentrer dans le vif du sujet, j'ai repris le code du sample Terrain, que j'ai modifié pour mettre le robot qui se déplace a l'aide du clavier, avec une camera qui le suit derriere.
Lorsqu'on appuie sur les touches gauche/droite, le robot fais une rotation sur lui-même afin de changer de direction, et la camera suis le mouvement pour s'ajuster derriere lui... (merci comtois

Le problème est qu'à certains angles, la camera n'est pas bien orienté vers le robot (malgrès le "CameraLookAt(0, EntityX(#robot)-30,EntityY(#robot)+40,EntityZ(#robot))" )...
Voila le code: (qui utilise les médias en sample dans PureBasic\Examples\Sources\Data)
(faite pas attention a l'absence de structures)
Code : Tout sélectionner
IncludeFile "Screen3DRequester.pb"
;-déclarer variables
#RobotMesh = 2
#RobotTexture = 2
#Robot = 2
distancecamera.f=100
vitesserobot.f=3
angle.f=90
If InitEngine3D()
Add3DArchive("Data\" , #PB_3DArchive_FileSystem)
Add3DArchive("Data\Skybox.zip", #PB_3DArchive_Zip)
InitSprite()
InitKeyboard()
InitMouse()
If Screen3DRequester()
AmbientColor(RGB(255,255,255))
CreateMaterial (0, LoadTexture(0, "Terrain_Texture.jpg"))
AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1)
CreateTerrain("Terrain.png", MaterialID(0), 4, 0.6, 4, 1)
CreateCamera(0, 0, 0, 100, 100)
SkyDome("Clouds.jpg",10)
LoadMesh (#RobotMesh , "Robot.mesh")
LoadTexture(#RobotTexture, "r2skin.jpg")
CreateMaterial(2, TextureID(#RobotTexture))
CreateEntity(#Robot, MeshID(#RobotMesh), MaterialID(2))
ScaleEntity(#robot,0.5,0.5,0.5)
EntityLocate(#robot, 128, 30, 128)
CameraLocate(0, EntityX(#robot),EntityY(#robot)+50,EntityZ(#robot))
Repeat
ClearScreen(0,0,0)
Screen3DEvents()
;-Regler la hauteur du robot par rapport au terrain
If EntityY(#robot) <> TerrainHeight(EntityX(#robot), EntityZ(#robot))
Movey.f=TerrainHeight(EntityX(#robot), EntityZ(#robot))-EntityY(#robot)+2
MoveEntity(#Robot,0,movey,0)
EndIf
;-garder l'angle entre 0 et 360
If angle>360
angle=angle-360
EndIf
If angle<0
angle=angle+360
EndIf
;conversion de l'angle du robot en Radian pour le calcul COS/SIN
AngleR.f = Angle * 0.0174533
x.f= Sin(angleR)
z.f=Cos(angleR)
;Controle du robot avec le clavier
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
RotateEntity(#Robot,5,0,0)
angle=angle+5
ElseIf KeyboardPushed(#PB_Key_Right)
RotateEntity(#Robot,-5,0,0)
angle=angle-5
EndIf
If KeyboardPushed(#PB_Key_Up)
MoveEntity(#Robot,x*vitesserobot,0,z*vitesserobot)
ElseIf KeyboardPushed(#PB_Key_Down)
MoveEntity(#Robot,-x*vitesserobot,0,-z*vitesserobot)
EndIf
EndIf
;gestion camera
CameraX.f=EntityX(#robot)-(x*distancecamera)
CameraZ.f=EntityZ(#robot)-(z*distancecamera)
CameraLocate(0,camerax,EntityY(#robot)+50,cameraz)
CameraLookAt(0, EntityX(#robot)-30,EntityY(#robot)+40,EntityZ(#robot))
RenderWorld()
Screen3DStats()
Gosub fps
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
End
FPS:
If Val(FormatDate("%ss", Date()))=sek
FPS+1
Else
FPS$=Str(FPS)
FPS=0
EndIf
sek=Val(FormatDate("%ss", Date()))
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(255,255,255)
Locate(1,1)
DrawText("FPS: "+FPS$)
Locate(1,16)
Angle$=Str(angle)
DrawText("angle degrés: "+angle$)
Locate(1,31)
AngleR$=Str(AngleR)
DrawText("Angle Radian: "+angler$)
Locate(1,46)
Entityx$=Str(EntityX(#robot))
Entityz$=Str(EntityZ(#robot))
DrawText("Position Robot (X,Z): ("+Entityx$+","+entityz$+")")
Locate(1,61)
camerax$=Str(CameraX(0))
cameraz$=Str(CameraZ(0))
DrawText("Position Camera (X,Z): ("+camerax$+","+cameraz$+")")
StopDrawing()
Return