Page 1 sur 1

[4.60] Aéroglisseur avec le Physics Engine

Publié : mar. 22/nov./2011 22:03
par kelebrindae
Bonjour,

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! :wink:
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

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mar. 22/nov./2011 22:22
par Cool Dji
Salut kelebrindae,

Grrr je suis sur l'ordi de ma douce ce soir et j'ai pas la 4.6 finale installée dessus et les codes persos pour télécharger ne sont pas les bons...
Peux pas tester !!

En revanche, j'ai eu le même soucis avec les rotates dans l'editeur de décors 3d.
J'avais remarqué que l'on ne pouvait faire rotationner que 2 axes sur 3 (peu importe lesquels) pour pas avoir de choses bizarres entre les 2 opérations. Jamais compris pourquoi...

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mar. 22/nov./2011 22:40
par kelebrindae
@Cool Dji:
Si c'est ce que je crois, ça s'appelle un Gimbal Lock: avec les calculs de rotation classiques, ou "de Euler", la rotation sur les trois axes entraîne la perte d'un degré de liberté, et deux des axes se trouvent verrouillés ensembles (mais là, je te parle de choses que je ne comprends pas :P ).
La réponse est dans les quaternions: on fait les calculs sur 4 axes, comme ça on en perd pas un en route... J'avais codé ça en PB à mes débuts, ça doit encore se trouver quelque part sur le forum; essaie de chercher avec "quaternion".

Tiens, j'ai refait des essais en me passant de physic body caché, et finalement, ça ne marche pas trop mal. 'Y a encore des trucs bizarres, mais c'est un peu mieux...
Dites-moi ce que vous en pensez:

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.

#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(gliderMesh),#PB_Material_None)
  EntityLocate(glider,newX,newY,newZ)
  ScaleEntity(glider,2,1.5,2)
  EntityPhysicBody(glider,#PB_Entity_CylinderBody)
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")
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 = 0
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
      RotateEntity(glider,0,2,0,#PB_Relative)
    EndIf
    If KeyboardPushed(#PB_Key_Right)
      angle + 2
      RotateEntity(glider,0,-2,0,#PB_Relative)
    EndIf
    ;- Return: Reinitialize hovercraft
    If KeyboardReleased(#PB_Key_Return)
      FreeEntity(glider)
      createHovercraft(0,2,0)
    EndIf
    
  EndIf
   
  ; 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()
  
  ; Impulse here, after the collisions
  angle = 270-EntityYaw(glider)
  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
    

Until KeyboardPushed(#PB_Key_Escape)

End


Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mar. 22/nov./2011 22:49
par Cool Dji
Vi, les quarternions, G-Rom me les a présenté un jour aussi, mais j'ai eu du mal à comprendre ce qu'ils me disaient (on ne doit pas parler la même langue). Du coup, je n'ai pas cherché à les revoir même s'ils avaient l'air assez sympa ! C'est moche la vie :D

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mer. 23/nov./2011 18:18
par kelebrindae
Allez, encore une version! :roll:
Mais celle-là commence à devenir pilotable, voire même assez sympa. Et je n'ai pas noté de bug flagrant comme avec les précédentes. :mrgreen:

Principe: j'ai ajouté des petites roulettes sous l'aéroglisseur (que j'ai laissées visible pour illustrer le principe, mais qu'il est facile de cacher), et on dirige l'engin en appliquant la poussée sur ces roulettes. Quand on tourne à gauche ou à droite, j'applique plus de poussée sur les roulettes de l'un ou l'autre côté; simple.

NB: N'oubliez pas de récupérer le zip avec les meshes et les textures (cf. premier post).

Code : Tout sélectionner

; Author: Kelebrindae
; Date: november, 23, 2011
; PB version: v4.60
; ---------------------------------------------------------------------------------------------------------------
; Description:
; ---------------------------------------------------------------------------------------------------------------
; A little test of the physics engine. Use arrows to move around
; and F1,F2,F3,F4 to change view.

#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()

;- Window
OpenWindow(0, 0, 0, #SCREENWIDTH, #SCREENHEIGHT, "Vehicle 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))

;- Terrain
dimX = 60:dimY = 30
barrierHeight.f = 2:barrierWidth.f = 1
planeMesh = CreatePlane(#PB_Any,dimX,dimY,1,1,20,10)
sol  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(mtTerrain))
EntityPhysicBody(sol, #PB_Entity_StaticBody,999,0.5,0.5)

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.2,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.25,1,0)

;- Vehicle
gliderWidth.f = 1.3
gliderHeight.f = 0.7
gliderLength.f = 1.3
wheelRadius.f = 0.1
wheelPosX.f = (gliderWidth / 2) - wheelRadius
wheelPosY.f = wheelRadius
wheelPosZ.f = (gliderLength / 2) - wheelRadius
x = 10:z = 0

gliderMesh = LoadMesh(#PB_Any,"hovercraft.mesh")
glider = CreateEntity(#PB_Any,MeshID(gliderMesh),#PB_Material_None)
ScaleEntity(glider,2,1.5,2)
EntityLocate(glider,x,(gliderHeight / 2) + (wheelRadius * 2),z)
EntityPhysicBody(glider,#PB_Entity_CylinderBody)

wheelMesh = CreateSphere(#PB_Any,wheelRadius)
wheel_FL = CreateEntity(#PB_Any,MeshID(wheelMesh),MaterialID(mtbrown))
EntityLocate(wheel_FL,x - wheelPosX,wheelPosY,z - wheelPosZ)

wheel_FR = CreateEntity(#PB_Any,MeshID(wheelMesh),MaterialID(mtbrown))
EntityLocate(wheel_FR,x + wheelPosX,wheelPosY,z - wheelPosZ)

wheel_RL = CreateEntity(#PB_Any,MeshID(wheelMesh),MaterialID(mtbrown))
EntityLocate(wheel_RL,x - wheelPosX,wheelPosY,z + wheelPosZ)

wheel_RR = CreateEntity(#PB_Any,MeshID(wheelMesh),MaterialID(mtbrown))
EntityLocate(wheel_RR,x + wheelPosX,wheelPosY,z + wheelPosZ)

;- Vehicle bodies and joints
friction.f = 0.3
restitution.f = 0.1
mass.f = 1

EntityPhysicBody(wheel_FL,#PB_Entity_SphereBody,mass,restitution,friction)
EntityPhysicBody(wheel_FR,#PB_Entity_SphereBody,mass,restitution,friction)
EntityPhysicBody(wheel_RL,#PB_Entity_SphereBody,mass,restitution,friction)
EntityPhysicBody(wheel_RR,#PB_Entity_SphereBody,mass,restitution,friction)

HingeJoint(glider,-wheelPosX,-((gliderHeight / 2)+wheelPosY+0.1),-wheelPosZ,#True,#False,#False,wheel_FL,0,0,0,#True,#False,#False)
HingeJoint(glider, wheelPosX,-((gliderHeight / 2)+wheelPosY+0.1),-wheelPosZ,#True,#False,#False,wheel_FR,0,0,0,#True,#False,#False)
HingeJoint(glider,-wheelPosX,-((gliderHeight / 2)+wheelPosY+0.1),wheelPosZ,#True,#False,#False,wheel_RL,0,0,0,#True,#False,#False)
HingeJoint(glider, wheelPosX,-((gliderHeight / 2)+wheelPosY+0.1),wheelPosZ,#True,#False,#False,wheel_RR,0,0,0,#True,#False,#False)


;- 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 = 0
impulse.f = 0.2
leftRightRatio.f = 0.5
turboAvailable = #True
KeyboardMode(#PB_Keyboard_International)
Repeat
  Delay(1)
  While WindowEvent() : Wend

  ;- F1, F2, F3,F4 : Change view
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_F1)
    CameraLocate(0,-dimX/2,barrierHeight+2,-dimY/2)
    trackCam = #False
  EndIf
  If KeyboardReleased(#PB_Key_F2)
    CameraLocate(0,0,15,dimY)
    trackCam = #False
  EndIf
  If KeyboardReleased(#PB_Key_F3)
    CameraLocate(0,-5,0.3,5)
    trackCam = #False
  EndIf
  If KeyboardReleased(#PB_Key_F4)
    trackCam = #True
  EndIf
 
  ;- Cursor keys: Move
  ; Turning left / right = changing the amount of impulse applied to left/right wheels
  leftRightRatio = 0.5
  If KeyboardPushed(#PB_Key_Left)
    leftRightRatio = 0.1
  ElseIf KeyboardPushed(#PB_Key_Right)
    leftRightRatio = 0.9
  EndIf
 
  ; Apply impulse on each wheel
  angle = 270-EntityYaw(glider)
  If KeyboardPushed(#PB_Key_Up)
    ApplyEntityImpulse(wheel_FL,leftRightRatio * impulse * Cos(Radian(angle)),0,leftRightRatio * impulse * Sin(Radian(angle)) )
    ApplyEntityImpulse(wheel_RL,leftRightRatio * impulse * Cos(Radian(angle)),0,leftRightRatio * impulse * Sin(Radian(angle)) )
   
    ApplyEntityImpulse(wheel_FR,(1 - leftRightRatio) * impulse * Cos(Radian(angle)),0,(1 - leftRightRatio) * impulse * Sin(Radian(angle)) )
    ApplyEntityImpulse(wheel_RR,(1 - leftRightRatio) * impulse * Cos(Radian(angle)),0,(1 - leftRightRatio) * impulse * Sin(Radian(angle)) )
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    ApplyEntityImpulse(wheel_FL,leftRightRatio * -impulse * Cos(Radian(angle)),0,leftRightRatio * -impulse * Sin(Radian(angle)) )
    ApplyEntityImpulse(wheel_RL,leftRightRatio * -impulse * Cos(Radian(angle)),0,leftRightRatio * -impulse * Sin(Radian(angle)) )
   
    ApplyEntityImpulse(wheel_FR,(1 - leftRightRatio) * -impulse * Cos(Radian(angle)),0,(1 - leftRightRatio) * -impulse * Sin(Radian(angle)) )
    ApplyEntityImpulse(wheel_RR,(1 - leftRightRatio) * -impulse * Cos(Radian(angle)),0,(1 - leftRightRatio) * -impulse * Sin(Radian(angle)) )
  EndIf
 
   
  ; Turn camera toward vehicle
  If trackCam = #True
    CameraLocate(0,EntityX(glider) + -5 * Cos(Radian(angle)),2.5,EntityZ(glider) + -5 * Sin(Radian(angle)))
  EndIf
  CameraLookAt(0,EntityX(glider),EntityY(glider),EntityZ(glider))

  ; Render
  RenderWorld()
  FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)

End

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mer. 23/nov./2011 21:42
par comtois
Sympa toutes ces versions, je trouve que la dernière est plus difficile à manoeuvrer.
Et j'imagine que c'est toi qui a créé le modèle ? Ah si seulement j'avais la patience et la capacité de faire des trucs comme ça. Je suis condamné à bouger des cubes et des sphères :)

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mer. 23/nov./2011 22:21
par Kwai chang caine
Bonjour à tous
Excusez moi de gacher la fete en posant encore la question qui tue, mais moi aussi j'voudrais aeroglisser :mrgreen:

Mais pourquoi j'ai le message erreur Dll D3DX9_42 manquante :(

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : jeu. 24/nov./2011 9:28
par kelebrindae
comtois a écrit :Sympa toutes ces versions, je trouve que la dernière est plus difficile à manoeuvrer.
Dommage, c'est la seule qui ne soit pas buggée... :lol: Mais c'est vrai que le maniement de l'appareil demande un peu d'entrainement; le fait qu'il ne braque plus quand on accélère pas, par exemple, est un peu gênant. J'essaierai d'arranger ça...
(Et pour le mesh, non, il n'est pas de moi. Je l'ai récupéré d'un vieux tuto DarkBasic d'un dénommé "Binary Moon".)

@Kwai chang caine:
Essaie de mettre à jour ta version de DirectX, ça vient peut-être de là (?).

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mar. 29/nov./2011 12:03
par Kwai chang caine
@Kwai chang caine:
Essaie de mettre à jour ta version de DirectX, ça vient peut-être de là (?).
Merci de l'info, j'ai essayé et pas mieux :(
J'avais le même bleme sur un autre portable, alors j'ai essayé de faire betement (Ce qu'en fait je sais le mieux faire :oops: ) ce que disais le panneau :mrgreen:
J'ai téléchargé la DLL "D3DX9_42.dll" et je l'ai posé dans le SYS32 et la plus de panneau

Par contre j'ai une erreur sur la ligne

Code : Tout sélectionner

RenderWorld()
Si quelqu'un a une idée pour que je puisse glisser avec vous :(

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mar. 29/nov./2011 12:35
par comtois
Kwai chang caine a écrit :J'ai téléchargé la DLL "D3DX9_42.dll" et je l'ai posé dans le SYS32 et la plus de panneau
Faut pas faire comme ça ! Si tu as ce message c'est que tu n'as pas la bonne version de directx sur ton pc, dans ce cas, il faut installer correctement DirectX End-User Runtimes
Freak avait préconisé cette version :
http://www.microsoft.com/download/en/de ... en&id=6883

Tu peux essayer de l'installer.

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mar. 29/nov./2011 12:49
par Kwai chang caine
Merci beaucoup COMTOIS, je vais essayer, sur la machine ou je suis actuellement j'ai pas tous les droits, donc c'est pas gagné. :(
Mais de retour ce WE, j'essaierais sur celle qui m'autorise à la tripoter tout partout, un peu une seconde femme quoi :mrgreen:
Encore merci 8)

Re: [4.60] Aéroglisseur avec le Physics Engine

Publié : mar. 29/nov./2011 12:59
par Kwai chang caine
Super ça marche du tonnere, en fin de compte ma machine actuelle n'est pas si "prude" :D
T'es un chef COMTOIS, ce dont je n'ai jamais douté, je vais installé cette version de DIRECTX tout partout sur mes machines.
Je vais pouvoir enfin voir tous les codes qui pour l'instant ne marchaient jamais nulle part :( (Enfin j'espere :roll: )
J'avais loupé l'info de FREAK :oops:
Mille merci 8)

@kelebrindae
Et ben...ça vallait le coup !!
Super joli ton glisseur avec des yeux....
Le coup des vues qui change c'est vraiment de la balle, je suppose que c'est ça la force de OGRE :roll:

Merci à vous deux d'avoir partagé un peu de vos connaissances, afin que je puisse mettre, ne serais ce que le bout de l'ongle, du petit narpion gauche, dans le monde fantastique monde de la 3D, et de ce fait, voyager un peu à vos cotés 8)