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)