Joints

Généralités sur la programmation 3D
Avatar de l’utilisateur
Guillot
Messages : 529
Inscription : jeu. 25/juin/2015 16:18

Joints

Message par Guillot »

Non désolé, j'ai rien à faire tourner, là je parle de la 3d

ç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)