[4.60 beta] Hinge joints (charnières)
Publié : mer. 06/avr./2011 11:20
Bonjour à tous,
Voici une autre mini-démo de la physique dans PB 4.60. Cette fois, je voulais expérimenter les "Hinge joints", ce que l'on pourrait traduire par "charnières".
Mon souci est que, si j'attache un objet A à un objet B avec une charnière, je ne suis pas parvenu à restreindre le mouvement de l'objet A à un seul axe (comme sur une porte, par exemple: la porte ne bouge qu'autour de l'axe vertical).
Si quelqu'un sait comment faire, je suis preneur!
F1 à F3 => caméras
[Espace] => donner de l'élan au marteau
R => repositionner la balle (mais ça plante; le "FreeEntity" n'est apparemment pas signalé au moteur physique)
Voici une autre mini-démo de la physique dans PB 4.60. Cette fois, je voulais expérimenter les "Hinge joints", ce que l'on pourrait traduire par "charnières".
Mon souci est que, si j'attache un objet A à un objet B avec une charnière, je ne suis pas parvenu à restreindre le mouvement de l'objet A à un seul axe (comme sur une porte, par exemple: la porte ne bouge qu'autour de l'axe vertical).

Si quelqu'un sait comment faire, je suis preneur!
F1 à F3 => caméras
[Espace] => donner de l'élan au marteau
R => repositionner la balle (mais ça plante; le "FreeEntity" n'est apparemment pas signalé au moteur physique)
Code : Tout sélectionner
; Window size
#SCREENWIDTH = 800
#SCREENHEIGHT = 500
;- initialization
InitSprite()
InitEngine3D()
InitKeyboard()
;- 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(".",#PB_3DArchive_FileSystem)
CreateImage(0,128, 128)
StartDrawing(ImageOutput(0))
Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()
SaveImage(0,"temp.bmp")
FreeImage(0)
LoadTexture(0,"temp.bmp")
DeleteFile("temp.bmp")
;-Material
CreateMaterial(1,TextureID(0))
MaterialAmbientColor(1,#PB_Material_AmbientColors)
CreateMaterial(2,TextureID(0))
MaterialAmbientColor(2,$FFFF00)
CreateMaterial(3,TextureID(0))
MaterialAmbientColor(3,$0077FF)
CreateMaterial(4,TextureID(0))
MaterialAmbientColor(4,$FF00FF)
CreateMaterial(5,TextureID(0))
MaterialAmbientColor(5,$0055BB)
;- Entities
CreatePlane(4,2,2,20,20,1,1)
sol = CreateEntity(#PB_Any, MeshID(4), MaterialID(1))
EntityPhysicBody(sol, #PB_Entity_StaticBody)
; Ball and tee
CreateCube(1, 1.0)
socle = CreateEntity(#PB_Any,MeshID(1), MaterialID(1))
ScaleEntity(socle,0.5,1,0.5)
EntityLocate(socle,-1.6,0.5,0)
EntityPhysicBody(socle, #PB_Entity_BoxBody,0.1)
CreateSphere(3,0.5)
ball = CreateEntity(#PB_Any, MeshID(3), MaterialID(3))
EntityLocate(ball,-1.6,1.5,0)
EntityPhysicBody(ball, #PB_Entity_SphereBody,0.5)
; Targets
For i = 1 To 4
temp = CreateEntity(#PB_Any, MeshID(1), MaterialID(4))
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(1), MaterialID(4))
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(1), MaterialID(4))
EntityLocate(temp,-10,2.5,(i*1.1)-1.8)
EntityPhysicBody(temp, #PB_Entity_BoxBody, 0.25)
Next i
; Mobile
Global hammerX.f = 2.3,hammerY.f = 7.7,hammerZ.f
;CreateCylinder(2,0.4,5) ; Cylinders don't seem to work very well with physics (?)
CreateSphere(2,0.4)
axe = CreateEntity(#PB_Any, MeshID(2), MaterialID(2))
;RotateEntity(axe,90,0,0)
EntityLocate(axe,hammerX,hammerY,hammerZ)
EntityPhysicBody(axe, #PB_Entity_StaticBody)
shaft = CreateEntity(#PB_Any, MeshID(1), MaterialID(5))
ScaleEntity(shaft,0.3,6,0.3)
EntityLocate(shaft,hammerX,hammerY - 3.5,hammerZ)
EntityPhysicBody(shaft, #PB_Entity_BoxBody,0.1)
hammerhead = CreateEntity(#PB_Any,MeshID(1), MaterialID(2))
ScaleEntity(hammerhead,2,1,1)
EntityLocate(hammerhead,hammerX,hammerY - 7,hammerZ)
EntityPhysicBody(hammerhead,#PB_Entity_BoxBody,50)
PointJoint(shaft,0,-3.1 ,0, hammerhead,0,0.5,0) ; Attach the hammerhead to the shaft
; Attach the hammer to axis. How do we restrain the hammer movement to one axis only ?
HingeJoint(axe,0,0,0, 0,0,1, shaft,0,3.5,0, 0,0,0)
HingeJoint(axe,0,0,0, 0,0,1, hammerhead,0,7,0, 0,0,0)
;- Camera
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,-2,8,18)
CameraLookAt(0,-2,5,0)
;-Light
AmbientColor($666666)
CreateLight(0,RGB(160,160,255),200,400,200)
WorldShadows(#PB_Shadow_Additive)
;- Main loop
Repeat
Delay(1)
While WindowEvent() : Wend
;- F1, F2, F3 : Change view
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
CameraLocate(0,-18,2,0)
CameraLookAt(0,0,3,0)
EndIf
If KeyboardReleased(#PB_Key_F2)
CameraLocate(0,0,12,20)
CameraLookAt(0,0,5,0)
EndIf
If KeyboardReleased(#PB_Key_F3)
CameraLocate(0,1,5,10)
CameraLookAt(0,-3,3,0)
EndIf
;- [Space] : Throw hammer
If KeyboardPushed(#PB_Key_Space)
ApplyEntityImpulse(hammerhead, 10, 0, 0)
EndIf
;- R : Reset ball's position (doesn't work)
If KeyboardReleased(#PB_Key_R)
FreeEntity(ball)
EndIf
;- Return : Display FPS
If KeyboardReleased(#PB_Key_Return)
MessageRequester("Infos","FPS = " + Str(Engine3DFrameRate(#PB_Engine3D_Average)))
EndIf
EndIf
; Render
RenderWorld()
FlipBuffers()
If Not IsEntity(ball)
ball = CreateEntity(#PB_Any, MeshID(3), MaterialID(3))
EntityLocate(ball,-1.6,1.5,0)
EntityPhysicBody(ball, #PB_Entity_SphereBody)
EndIf
Until KeyboardPushed(#PB_Key_Escape)
End