Voici un petit test du moteur physique, qui met en scène un petit aéroglisseur que vous pouvez piloter avec le flèches du curseur.
Le principe est simple: un "physic body" de type "cylindre", auquel j'applique une impulsion orientée en fonction de l'angle Y défini par les flèches gauche-droite. Par dessus ce body (qui est caché), je positionne mon entity en forme d'aéroglisseur, en l'orientant selon l'angle Y et les Roll/Pitch du physic body.
J'ai adopté cette méthode parce qu'en faisant des "rotateEntity" directement sur le body, j'avais l'impression d'obtenir des résultats bizarres (le body n'était plus au même endroit que l'entity liée).
Problème: je n'arrive pas à garder l'aéroglisser orienté de la même façon que le physic body. Peut-être un souci avec le "rotateEntity" (gimbal lock?), ou avec les "EntityPitch" / "EntityRoll"; je ne sais pas...

Bref, je vous laisse tester; si quelqu'un a une solution, je suis preneur!

Vous aurez besoin des textures/mesh présents dans ce zip: http://keleb.free.fr/codecorner/downloa ... medias.zip
Enregistrez le code, puis dézippez le zip dans un sous-répertoire "medias"; ça devrait marcher.
Code : Tout sélectionner
; Author: Kelebrindae
; Date: november, 22, 2011
; PB version: v4.60
; ---------------------------------------------------------------------------------------------------------------
; Description:
; ---------------------------------------------------------------------------------------------------------------
; A little test of the physics engine. Use arrows to move, space to activate boost,
; and F1,F2,F3,F4 to change view.
;
; ---------------------------------------------------------------------------------------------------------------
; Bugs:
; ---------------------------------------------------------------------------------------------------------------
; I can't keep the hovercraft model's orientation "aligned" to the physic body's orientation...
#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
; Window size
#SCREENWIDTH = 800
#SCREENHEIGHT = 500
;- initialization
InitEngine3D()
InitSprite()
InitKeyboard()
Macro createHovercraft(newX,newY,newZ)
glider = CreateEntity(#PB_Any,MeshID(cylMesh),#PB_Material_None)
EntityLocate(glider,newX,newY,newZ)
ScaleEntity(glider,2,1.5,2)
HideEntity(glider,#True)
EntityPhysicBody(glider,#PB_Entity_CylinderBody)
gliderDummy = CreateEntity(#PB_Any,MeshID(gliderMesh),#PB_Material_None)
ScaleEntity(gliderDummy,2,1.5,2)
EndMacro
;- Window
OpenWindow(0, 0, 0, #SCREENWIDTH, #SCREENHEIGHT, "Joint test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0), 0, 0, #SCREENWIDTH,#SCREENHEIGHT, 0, 0, 0,#PB_Screen_SmartSynchronization)
;-Texture
Add3DArchive("medias",#PB_3DArchive_FileSystem)
Parse3DScripts()
txBlank = CreateTexture(#PB_Any,4,4)
StartDrawing(TextureOutput(txBlank))
Box(0, 0, 4,4, $FFFFFF)
StopDrawing()
txTerrain = CreateTexture(#PB_Any,128, 128)
StartDrawing(TextureOutput(txTerrain))
Box(0, 0, 128, 128, $007700)
Line(0,0,128,1, $00BB00)
Line(0,1,128,1, $00EE00)
Line(0,2,128,1, $00BB00)
Line(0,0,1,128, $00BB00)
Line(1,0,1,128, $00EE00)
Line(2,0,1,128, $00BB00)
StopDrawing()
txCrate = LoadTexture(#PB_Any,"crate.png")
;-Material
mtTerrain = CreateMaterial(#PB_Any,TextureID(txTerrain))
mtGlass = CreateMaterial(#PB_Any,TextureID(txBlank))
MaterialDiffuseColor(mtGlass,$BBBB00)
MaterialBlendingMode(mtGlass, #PB_Material_Add)
mtRed = CreateMaterial(#PB_Any,TextureID(txBlank))
MaterialAmbientColor(mtRed,$0000FF)
mtBrown = CreateMaterial(#PB_Any,TextureID(txCrate))
;- Entities
; Terrain
dimX = 50:dimY = 25
barrierHeight.f = 2:barrierWidth.f = 1
planeMesh = CreatePlane(#PB_Any,dimX*2,dimY*2,1,1,10,10)
sol = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(mtTerrain))
EntityLocate(sol,dimX/2,0,dimY/2)
EntityPhysicBody(sol, #PB_Entity_StaticBody,999,0,0.2)
cubeMesh = CreateCube(#PB_Any,1)
barrier1 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtGlass))
ScaleEntity(barrier1,dimX,barrierHeight,barrierWidth)
EntityLocate(barrier1,0,barrierHeight / 2,-(dimY / 2 + barrierWidth / 2))
EntityPhysicBody(barrier1, #PB_Entity_StaticBody,999,0.5,0)
barrier2 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtGlass))
ScaleEntity(barrier2,dimX,barrierHeight,barrierWidth)
EntityLocate(barrier2,0,barrierHeight / 2,(dimY / 2 + barrierWidth / 2))
EntityPhysicBody(barrier2, #PB_Entity_StaticBody,999,0.5,0)
barrier3 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtGlass))
ScaleEntity(barrier3,barrierWidth,barrierHeight,dimY)
EntityLocate(barrier3,-(dimX / 2 + barrierWidth / 2),barrierHeight / 2,0)
EntityPhysicBody(barrier3, #PB_Entity_StaticBody,999,0.5,0)
barrier4 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtGlass))
ScaleEntity(barrier4,barrierWidth,barrierHeight,dimY)
EntityLocate(barrier4,(dimX / 2 + barrierWidth / 2),barrierHeight / 2,0)
EntityPhysicBody(barrier4, #PB_Entity_StaticBody,999,0.5,0)
jump = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtTerrain))
ScaleEntity(jump,5,3,3)
RotateEntity(jump,0,0,-15)
EntityLocate(jump,0,-1,0)
EntityPhysicBody(jump, #PB_Entity_StaticBody,999,0,0)
; Boxes
For i = 1 To 4
temp = CreateEntity(#PB_Any, MeshID(cubeMesh), MaterialID(mtBrown))
EntityLocate(temp,-10,0.5,(i*1.1)-2.8)
EntityPhysicBody(temp, #PB_Entity_BoxBody, 0.25)
Next i
For i = 1 To 3
temp = CreateEntity(#PB_Any, MeshID(cubeMesh), MaterialID(mtBrown))
EntityLocate(temp,-10,1.5,(i*1.1)-2.3)
EntityPhysicBody(temp, #PB_Entity_BoxBody, 0.25)
Next i
For i = 1 To 2
temp = CreateEntity(#PB_Any, MeshID(cubeMesh), MaterialID(mtBrown))
EntityLocate(temp,-10,2.5,(i*1.1)-1.8)
EntityPhysicBody(temp, #PB_Entity_BoxBody, 0.25)
Next i
; Ball
sphereMesh = CreateSphere(#PB_Any,1)
ball = CreateEntity(#PB_Any,MeshID(sphereMesh),MaterialID(mtRed))
ScaleEntity(ball,0.5,0.5,0.5)
EntityLocate(ball,0,5,0)
EntityPhysicBody(ball,#PB_Entity_SphereBody,0.5,1,0)
; Vehicle
gliderMesh = LoadMesh(#PB_Any,"hovercraft.mesh")
cylMesh = CreateCylinder(#PB_Any,0.5,0.56)
createHovercraft(5,1,0)
;- Camera
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,0,15,dimY)
CameraLookAt(0,0,5,0)
;-Light
AmbientColor($333333)
CreateLight(0,$FFFFFF,200,400,200)
WorldShadows(#PB_Shadow_Additive)
;- Main loop
angle.f = 181
impulse.f = 0.1
turboAvailable = #True
KeyboardMode(#PB_Keyboard_International)
Repeat
Delay(1)
While WindowEvent() : Wend
;- F1, F2, F3,F4 : Change view
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
CameraLocate(0,dimX/2,barrierHeight+2,0)
trackCam = #False
EndIf
If KeyboardReleased(#PB_Key_F2)
CameraLocate(0,0,15,dimY)
trackCam = #False
EndIf
If KeyboardReleased(#PB_Key_F3)
CameraLocate(0,0,barrierHeight * 2,dimY/2)
trackCam = #False
EndIf
If KeyboardReleased(#PB_Key_F4)
trackCam = #True
EndIf
;- Cursor keys: Move
If KeyboardPushed(#PB_Key_Left)
angle - 2
EndIf
If KeyboardPushed(#PB_Key_Right)
angle + 2
EndIf
If KeyboardPushed(#PB_Key_Up)
ApplyEntityImpulse(glider,impulse * Cos(Radian(angle)),0,impulse * Sin(Radian(angle)) )
EndIf
;- Space key: Boost
If KeyboardPushed(#PB_Key_Space) And turboAvailable = #True
ApplyEntityImpulse(glider,impulse * 100 * Cos(Radian(angle)),0,impulse * 100 * Sin(Radian(angle)) )
turboAvailable = #False
ElseIf KeyboardReleased(#PB_Key_Space)
turboAvailable = #True
EndIf
;- Return: Reinitialize hovercraft
If KeyboardReleased(#PB_Key_Return)
FreeEntity(glider)
FreeEntity(gliderDummy)
createHovercraft(0,2,0)
EndIf
;- H : Show physic body
If KeyboardReleased(#PB_Key_H)
HideEntity(glider,hide)
hide = 1 - hide
HideEntity(gliderDummy,hide)
EndIf
EndIf
; Place dummy over the "real" physic body
EntityLocate(gliderDummy,EntityX(glider),EntityY(glider),EntityZ(glider))
RotateEntity(gliderDummy,EntityPitch(glider),270 - angle,EntityRoll(glider),#PB_Engine_Space_World | #PB_Engine_quaternion_Rotation | #PB_Engine_Absolute_Rotation)
; Turn camera toward vehicle
If trackCam = #True
CameraLocate(0,EntityX(glider) + -10 * Cos(Radian(angle)),10,EntityZ(glider) + -10 * Sin(Radian(angle)))
EndIf
CameraLookAt(0,EntityX(glider),EntityY(glider),EntityZ(glider))
; Render
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End