ça fait une semaine que je me bats pour faire des suspensions à mon 4x4 (il tient pas la route)
le resultat est pas vraiment fantastique, mais c'est mieux que rien
j'ai essayé 50 methodes, mais les joints me paraisse etre un peu du bricolage
j'utilise une glissiere (SliderJoint) avec un debatement nul
c'est pas un ressort mais c'est ce que j'ai trouvé de mieux pour rompre la rigidité de l'ensemble (roues + chassis)
attention avec les joints y'a pas mal de surprises:
ex : changez la masse de l'entité qui relie la roue (ligne 61), vous verrez qu'elle influ sur le comportement du joint
(mettez à la place du "5" : "1", "0.1" et le mieux : "0")
si quelqu'un a mieux je suis preneur
(peut etre avec 3 ou pointjoint (le seul joint qui prend en compte l'ammortissement (damping))
mais le principal probleme de la physique, c'est les entité qui peuvent se traverser
les roues peuvent rester coincer de l'autre coté du décors !
là aussi, si quelqu'un à une solution...
une autre curiosité, en activant les ombres (F3) la brillance est modifiée
le code
Code : Tout sélectionner
EnableExplicit
Define.f anglec,v,angle,sens,h
Define i,ii,j,c,l,dis=0,vdis=2<<dis*1,ex,ey,ombre
Procedure matiere(num,dx,dy,c1,c2, brillance=$888888)
Protected i,j,y
CreateTexture(num,dx,dy)
StartDrawing(TextureOutput(num))
DrawingMode(#PB_2DDrawing_AllChannels )
Box(0,0,dx,dy,c2)
Box(1,1,dx-2,dy-2,c1)
StopDrawing()
CreateMaterial(num, TextureID(num))
If brillance:SetMaterialColor(num, #PB_Material_SpecularColor, brillance):MaterialShininess(num, 20):EndIf
EndProcedure
InitEngine3D():InitSprite():InitKeyboard():InitMouse()
AntialiasingMode(#PB_AntialiasingMode_x4)
OpenWindow(0, 0, 0, 0,0, " Test - joint curseur + F2(camera) + F3(ombres)",#PB_Window_Maximize)
ex=WindowWidth (0,#PB_Window_InnerCoordinate)
ey=WindowHeight(0,#PB_Window_InnerCoordinate)
OpenWindowedScreen(WindowID(0), 0, 0, ex, ey, 0, 0, 0)
CreateLight(0,$888888, 5000, 3000, 2000)
SetLightColor(0, #PB_Light_SpecularColor, $ffffff)
AmbientColor($777777)
CreateCamera(0, 0, 0, 100, 100):MoveCamera(0,0,10,-20)
CameraBackColor(0,$888888)
;WorldDebug(#PB_World_DebugBody)
matiere(0,256,256,$444444,$111111)
matiere(1,256,256,$884444,$441111)
matiere(2,256,256,$ffff00,$444400)
matiere(3,256,256,$ffffff,$444444)
matiere(4,256,256,$4444ff,$4444ff)
matiere(10,256,256,$888888,$222222)
;piste
CreatePlane(0,100,100,1,1,100,100)
CreateEntity(100,MeshID(0),MaterialID(10),0,0,0):CreateEntityBody(100,#PB_Entity_StaticBody,1,0,1)
CreateCone(0,4,2,32,4)
For i=200 To 219:CreateEntity(i,MeshID(0),MaterialID(4),Random(100)-50,1,Random(100)-50):CreateEntityBody(i,#PB_Entity_StaticBody,1,0,1):Next
CreateCube(0,4)
For i=300 To 339:CreateEntity(i,MeshID(0),MaterialID(1),Random(100)-50,-1,Random(100)-50):RotateEntity(i,25,Random(360),0):CreateEntityBody(i,#PB_Entity_StaticBody,1,0,1):Next
; voiture
h=4
CreateCube(0,2):TransformMesh(0,0,0,0,0.2,0.01,0.8,0,0,0):UpdateMeshBoundingBox(0)
CreateEntity(0, MeshID(0), #PB_Material_None,0,h,0):CreateEntityBody(0, #PB_Entity_ConvexHullBody , 1, 0.0,0.3):SetEntityCollisionFilter(0, 1,2)
SetEntityAttribute(0,#PB_Entity_LinearSleeping,0)
;suspensions
CreateCube(1,0.1)
;roues
CreateCylinder(2, 0.2, 0.2)
c=0
For j=-1 To 1 Step 2:For i=-1 To 1 Step 2:c+1
CreateEntity(c, MeshID(2), MaterialID(0),0.4*i, -0.4+h, -0.8*j):CreateEntityBody(c, #PB_Entity_CylinderBody, 1, 0,1):SetEntityCollisionFilter(c, 1,2)
CreateEntity(c+4, MeshID(1), MaterialID(2),0.8*i, 0.2+h, -1.5*j):CreateEntityBody(c+4, #PB_Entity_BoxBody, 5, 0,1):SetEntityCollisionFilter(c+4, 1,2)
SliderJoint(c+4, EntityID(0),0.3*i, 0.0, -0.8*j, EntityID(c+4), 0, 0.0, 0)
SetJointAttribute(c+4, #PB_SliderJoint_LowerLimit, 0)
SetJointAttribute(c+4, #PB_SliderJoint_UpperLimit, 0)
HingeJoint(c, EntityID(c+4), 0.1*i, 0, 0, -i, 0, 0, EntityID(c), 0, 0, 0, 0, 1, 0)
Next :Next
CreateNode(0,0,0.0,-1):AttachEntityObject(0,"",NodeID(0))
CreateNode(1,0,0.1,0) :AttachEntityObject(0,"",NodeID(1))
Macro KBdep(k1,k2)
(Bool(KeyboardPushed(k1)<>0)-Bool(KeyboardPushed(k2)<>0))
EndMacro
Repeat
ExamineMouse()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_F2):dis=(dis+1)%3:vdis=2<<dis*1:EndIf
If KeyboardReleased(#PB_Key_F3):ombre=1-ombre:If ombre:WorldShadows(#PB_Shadow_Additive):Else:WorldShadows(#PB_Shadow_None):EndIf:EndIf ;chuis de ton avis Blendman ! (mais le top c'est NOT(~))
;voiture
angle+KBdep(#PB_Key_Left,#PB_Key_Right)*-0.02:angle/(Abs(sens)*0.002+1)
sens +KBdep(#PB_Key_Up,#PB_Key_Down) *0.50:sens*0.99
HingeJoint(1, EntityID(5), -0.1,0,0, 1, 0, angle, EntityID(1), 0, 0, 0, 0, 1, 0)
HingeJoint(2, EntityID(6), 0.1,0,0, -1, 0, -angle, EntityID(2), 0, 0, 0, 0, 1, 0)
For i=1 To 4:sens=-sens:EnableHingeJointAngularMotor (i,1,sens,0.5):Next
CameraFollow(0, NodeID(1), -180,NodeY(0)+vdis, 2*vdis, 0.1, 0.1)
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)