genericjoint -demo voiture

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

genericjoint -demo voiture

Message par Guillot »

un petit exemple d'utilisation de genericjoint pour l'axe de rotation des roues, l'angle des roues (direction) et les suspensions (enfin !)
pour la rotation desc roue, j'utilise applyentitytorque :
avantage: on applique un couple au lieu d'imposer une vitessse de rotation, la voiture peine dans les montés
reste la gestion du freinage...

a noté : j'ai fait une fonction "orientation", util pour connaitre le vecteur directeur d'un objet 3d

Code : Tout sélectionner

EnableExplicit

;{ math
Structure vector3
  x.f
  y.f
  z.f
EndStructure

Macro getv(p)
  p\x = GetX()
  p\y = GetY()
  p\z = GetZ()
EndMacro

Macro vec3d(v,vx,vy,vz)
  v\x=vx
  v\y=vy
  v\z=vz
EndMacro

Macro sub3D(p,p1,p2)
  p\x=p1\x-p2\x
  p\y=p1\y-p2\y
  p\z=p1\z-p2\z
EndMacro

Macro mul3d(p1,v)
  p1\x*v
  p1\y*v
  p1\z*v
EndMacro
;}

Procedure localtoworld(oid.l ,*p.vector3)
  ConvertLocalToWorldPosition(oid,*p\x,*p\y,*p\z)
  getv(*p)
EndProcedure

Procedure orientation(oid.l,*p.vector3)
  Protected.vector3 p0,p1
  vec3d(p1,0,1,0)
  localtoworld(oid,p0) 
  localtoworld(oid,p1) 
  sub3d(*p,p1,p0)
EndProcedure

Macro limite(v,min,max)
    If v<min:v=min:EndIf
    If v>max:v=max:EndIf
EndMacro

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))
  MaterialFilteringMode(num,#PB_Material_Anisotropic ,4)
  If brillance:SetMaterialColor(num, #PB_Material_SpecularColor, brillance):MaterialShininess(num, 20):EndIf
EndProcedure

Define.f anglec,v,angle,sens,h
Define i,ii,j,c,l,dis=0,vdis=1<<dis*1,ex,ey,ombre,p.vector3

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) 

matiere(0,256,256,$444444,$111111)
matiere(1,256,256,$44ff44,$114411)
matiere(2,256,256,$00aaff,$003344)
matiere(3,256,256,$ffffff,$444444)
matiere(4,256,256,$4444ff,$4444ff)
matiere(5,256,256,$884444,$441111)
matiere(10,256,256,$888888,$222222)

;piste
CreatePlane(0,200,200,1,1,200,200)
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(5),Random(100)-50,-1,Random(100)-50):RotateEntity(i,25,Random(360),0):CreateEntityBody(i,#PB_Entity_StaticBody,1,0,1):Next
CreateCube(0,0.1):TransformMesh(0,0,0,0,1,0.5,50,0,0,0):UpdateMeshBoundingBox(0)
For i=400 To 439:CreateEntity(i,MeshID(0),MaterialID(2),Random(100)-50,0.05,Random(100)-50):RotateEntity(i,0,Random(360),0):CreateEntityBody(i,#PB_Entity_StaticBody,1,0,1):Next

; voiture
h=2
CreateCube(0,2):TransformMesh(0,0,0,0,0.3,0.1,0.8,0,0,0):UpdateMeshBoundingBox(0)
CreateEntity(0, MeshID(0), MaterialID(1),0,h,0):CreateEntityBody(0, #PB_Entity_ConvexHullBody , 4, 0.0,0.3):SetEntityCollisionFilter(0, 1,2)
SetEntityAttribute(0,#PB_Entity_LinearSleeping,0)
;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.5*i, -0.4+h, -0.8*j):CreateEntityBody(c, #PB_Entity_CylinderBody, 1, 0,1):SetEntityCollisionFilter(c,  1,2) 
    RotateEntity(c,0,0,90)
    GenericJoint(c, EntityID(0),0.5*i, -0.2, -0.8*j, EntityID(c), 0, 0, 0)
    SetJointAttribute(c, #PB_Joint_EnableSpring,1,1)
    SetJointAttribute(c, #PB_Joint_Damping,0.005,1)   
    SetJointAttribute(c, #PB_Joint_Stiffness,200,1)   
    SetJointAttribute(c, #PB_Joint_NoLimit,  0, 3) 
Next :Next 
CreateNode(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=1<<dis*1:EndIf
  If KeyboardReleased(#PB_Key_F3):ombre=1-ombre:If ombre:WorldShadows(#PB_Shadow_Additive):Else:WorldShadows(#PB_Shadow_None):EndIf:EndIf

  ;voiture
  angle+KBdep(#PB_Key_Left,#PB_Key_Right)*-0.02:angle*0.97:limite(angle,-0.6,0.6)
  sens =KBdep(#PB_Key_Up,#PB_Key_Down) * 1
  SetJointAttribute(1,#PB_Joint_Position,angle,4)
  SetJointAttribute(2,#PB_Joint_Position,angle,4)
  For i=1 To 4:orientation(EntityID(i),p):mul3d(p,sens):ApplyEntityTorque(i,p\x,p\y,p\z):Next   
   
  CameraFollow(0, NodeID(1), -180,NodeY(0)+vdis, 2*vdis, 0.1, 0.1)
  
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: genericjoint -demo voiture

Message par Kwai chang caine »

Etant donné les merveilles que tu produit, l'on ne peut lire un de tes POSTS sans ressentir le frémissement de vouloir tester une de tes nouvelles créations 8)
Alors quand je met pas "OPENGL" j'ai une erreur ligne 141 quand je fais F3 (Mais je pense que ça doit être normal)
Mais là ou c'est plus embetant, c'est que quand je le met, j'ai un ecran tout gris et rien ne se passe :|
J'ai W7 X86 et v5.60
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: genericjoint -demo voiture

Message par falsam »

Comme d'habitude, c'est du beau code ^^

Une autre façon de faire avec cet exemple fourni dans l'aide http://www.purebasic.com/french/documen ... le.pb.html

Merci pour ce code.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre