Page 1 sur 2

Physique - Avion

Publié : mar. 30/avr./2019 19:49
par Guillot
dans la serie 'simulateur mini budget', l'avion

Code : Tout sélectionner

;Physics - Airplane - pf Shadoko - 2019

EnableExplicit

Structure Vector3
  x.f
  y.f
  z.f
EndStructure

Structure PB_MeshVertexV  
  p.vector3
  n.vector3
  t.vector3
  u.f
  v.f
  color.l
EndStructure

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.f lng3D(*v.Vector3)
  ProcedureReturn Sqr(*V\x * *V\x + *V\y * *V\y + *V\z * *V\z)
EndProcedure

Procedure.f Pscalaire3d(*p.vector3,*q.vector3)
  ProcedureReturn *p\x * *q\x + *p\y * *q\y + *p\z * *q\z 
EndProcedure

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

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

Procedure.f POM(v.f)
  ProcedureReturn (Random(v*1000)-v*500)/500
EndProcedure

Procedure perlinarray2d(Array pa.f(2),rnd,periode,amplitude.f=1)
  Protected i,ii,dx=ArraySize(pa(),1),ddx=dx/periode,
            j,jj,dy=ArraySize(pa(),2),ddy=dy/periode
  Protected.f x,y,y0,y1,wx,wy
  
  RandomSeed(rnd)
  Dim t.f(ddx+1,ddy+1)
  For i=0 To ddx:For j=0 To ddy:t(i,j)=pom(amplitude):Next:Next
  For i=0 To ddx+1:t(i,ddy+1)=t(i,0):Next
  For j=0 To ddy+1:t(ddx+1,j)=t(0,j):Next
  
  For jj=0 To ddy
    For ii=0 To ddx
      For i=0 To periode-1
        x=i/periode
        wx=x*x*(3-2*x)
        For j=0 To periode-1
          y0=t(ii+1,jj  )*wx+t(ii,jj  )*(1-wx)
          y1=t(ii+1,jj+1)*wx+t(ii,jj+1)*(1-wx)
          y=j/periode
          wy=y*y*(3-2*y)
          pa(ii*periode+i,jj*periode+j)=y1*wy+y0*(1-wy)
        Next
      Next
    Next
  Next
EndProcedure

Procedure matiere(num,dx,dy,c1,c2, brillance=$888888,alpha=0,scale.f=1)
  CreateTexture(num,dx,dy)
  StartDrawing(TextureOutput(num))
  If alpha:DrawingMode(#PB_2DDrawing_AllChannels):EndIf
  Box(0,0,dx,dy,c2)
  Box(2,2,dx-4,dy-4,c1) 
  StopDrawing()
  CreateMaterial(num, TextureID(num))
  MaterialFilteringMode(num,#PB_Material_Anisotropic,4)
  ScaleMaterial(num,scale,scale)
  If brillance:SetMaterialColor(num, #PB_Material_SpecularColor, brillance):MaterialShininess(num, 40):EndIf
  If alpha:MaterialBlendingMode(num,#PB_Material_AlphaBlend):EndIf
EndProcedure

Procedure AddMesh(mesho,Mesh,mat, NewX.f=0 , NewY.f=0, NewZ.f=0, ScaleX.f=1, ScaleY.f=1, ScaleZ.f=1, RotateX.f=0, RotateY.f=0, RotateZ.f=0)
  Protected Dim MeshDataV.PB_MeshVertex(0)
  Protected Dim MeshDataF.PB_MeshFace(0)
  Protected i,meshc
  
  meshc=CopyMesh(mesh,-1)
  TransformMesh(Meshc, NewX,NewY,NewZ, ScaleX,ScaleY,ScaleZ, RotateX,RotateY,RotateZ)
  GetMeshData(Meshc,0, MeshDataV(), #PB_Mesh_Vertex |#PB_Mesh_Color | #PB_Mesh_UVCoordinate| #PB_Mesh_Normal, 0, MeshVertexCount(Meshc, 0)-1)
  GetMeshData(Meshc,0, MeshDataF(), #PB_Mesh_Face, 0, MeshIndexCount(Meshc, 0)-1)
  FreeMesh(meshc) 
  
  AddSubMesh()
  For i=0 To ArraySize(MeshDataV())
    With MeshDatav(i)
      MeshVertex(\x,\y,\z,\u,\v,$ffffff,\NormalX,\NormalY,\NormalZ)
    EndWith
  Next     
  For i=0 To ArraySize(MeshDataF()) Step 3
    MeshFace(MeshDataF(i)\Index, MeshDataF(i+1)\Index,MeshDataF(i+2)\Index)
  Next
  If mat>=0:SetMeshMaterial(mesho, MaterialID(mat), SubMeshCount(mesho)-1):EndIf
EndProcedure

;##########################################################################################################################################################
Global ex,ey,h.f

Procedure mesh_terrain(mesh,n) 
  Protected.f h, vx, vy
  Protected i,j,dt=4,n2=n/2
  Dim pa.f(n-1,n-1)
  
  perlinarray2d(pa(),0,16,16*4)
  
  Dim t.PB_MeshVertexV(n,n)
  RandomSeed(0)
  For j=0 To n
    For i=0 To n
      With t(i,j)  
        \p\x=(i-n2)*10
        \p\z=(j-n2)*10
        \p\y=pa(i & (n-1),j & (n-1)):If \p\y<0:\p\y=0:EndIf
        \u=i
        \v=j
        \color=$ffffff
      EndWith 
    Next
  Next
  CreateDataMesh(mesh,t())
  NormalizeMesh(mesh);UpdateMeshBoundingBox(mesh);BuildMeshShadowVolume(mesh)
EndProcedure

Procedure Init()
  Protected i
  InitEngine3D():InitSprite():InitKeyboard():InitMouse()
  
  OpenWindow(0, 0, 0, 800,600, "",#PB_Window_Maximize|#PB_Window_BorderLess)
  ex=WindowWidth (0,#PB_Window_InnerCoordinate)
  ey=WindowHeight(0,#PB_Window_InnerCoordinate)
  OpenWindowedScreen(WindowID(0), 0, 0, ex, ey, 0, 0, 0)
  LoadFont(0,"arial",11)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem):Parse3DScripts()
  
  EnableWorldPhysics(#True)
  EnableWorldCollisions(#True)
  WorldGravity(-10)
  
  CreateCamera(0, 0, 0, 100, 100):MoveCamera(0,0,10,-20)
  CameraBackColor(0,$ff8888) 
  
  CreateLight(0,$888888, 500,1000,0):SetLightColor(0, #PB_Light_SpecularColor, $ffffff)
  AmbientColor($444444)  
  
  ; -------------------- terrain
  matiere(0,256,256,$ff448888,$ff88cccc,0)
  mesh_terrain(100,256)
  CreateEntity(100,MeshID(100),MaterialID(0)):CreateEntityBody(100,#PB_Entity_StaticBody,1,0,1)
  EntityRenderMode(100,0)
  matiere(1,256,256,$aaaaaa,$ffffff,0):ScaleMaterial(1,0.1,0.1/6)
  CreateCube(101,1):TransformMesh(101,0,0,0,20,0.4,240,0,0,0):UpdateMeshBoundingBox(101)
  CreateEntity(101,MeshID(101),MaterialID(1)):CreateEntityBody(101,#PB_Entity_StaticBody,1,0,0.5)
  
  ; -------------------- plane
  CreateMesh(0)
  matiere(10,256,256,$88444444,$88444444,$ffffff,1)
  CreateSphere(1,0.3):AddMesh(0,1,10,0,0.3,-0.3, 1,1,1.9)
  matiere(11,256,256,$ff0000ff,$0000ff,$ffffff,0,4)
  CreateCapsule(1,0.4,0.6):AddMesh(0,1,11,0,0,0.5,1,1,1,-90,0,0)
  CreateCone(1,0.4,3,16,1):AddMesh(0,1,11,0,0,-1.3,1,1,1,-90,0,0)
  CreateCapsule(1, 0.3,0):AddMesh(0,1,11,0,0.2,-2.5,0.1,1.5,1,0,0,0)
  CreateCapsule(1, 0.3,0):AddMesh(0,1,11,0,0,-2.5,3,0.1,1,0,0,0)
  CreateCapsule(1, 0.5,5):AddMesh(0,1,11,0,0,0,1,1,0.2,90,0,90)  
  matiere(12,256,256,$444444,$000000,0)
  CreateCylinder(1,0.2,0.1):AddMesh(0,1,12,0.6,-0.6,0.5,1,1,1,0,0,90):AddMesh(0,1,12,-0.6,-0.6,0.5,1,1,1,0,0,90)
  FinishMesh(1):NormalizeMesh(0);UpdateMeshBoundingBox(0);BuildMeshShadowVolume(0)
  CreateEntity(0, MeshID(0), #PB_Material_None,0,0.8+0.2,0):CreateEntityBody(0, #PB_Entity_ConvexHullBody ,100, 0.0,0.2);EntityRenderMode(0, 0)
  SetEntityAttribute(0,#PB_Entity_LinearSleeping,0)
  
  ; helice
  matiere(13,256,256,$444444,$444444)
  CreateCapsule(2,0.1,0.5):TransformMesh(2,0,0,0,0.2,2,1,0,90,0):NormalizeMesh(2):UpdateMeshBoundingBox(2);:BuildMeshShadowVolume(2)
  CreateEntity(2, MeshID(2), MaterialID(13),0,0,1.3) 
  AttachEntityObject(0,"",EntityID(2))
  
  ; smoke
  LoadTexture(20, "smoke2.png")
  CreateMaterial(20, TextureID(20))
  DisableMaterialLighting(20, 1)
  MaterialBlendingMode   (20, #PB_Material_AlphaBlend)
  SetMaterialAttribute(20,#PB_Material_TAM,#PB_Material_ClampTAM)
  CreateParticleEmitter(0, 0.25,0,0,0,0,0,-2)
  ParticleMaterial    (0, MaterialID(20))
  ParticleSize        (0, 0.5,0.5)
  ParticleEmissionRate(0, 25)
  ParticleTimeToLive  (0, 1,1)
  ParticleScaleRate(0,2)
  ParticleAngle(0,-180,180,-90,90)
  ParticleColorFader(0,0,0,0,-1)
  DisableParticleEmitter(0,1)
  AttachEntityObject(0,"",ParticleEmitterID(0))
  
  RenderWorld(10000)
  WorldShadows(#PB_Shadow_Additive)
  ;WorldDebug(#PB_World_DebugEntity)
EndProcedure

Procedure stabilise(entity,f.f)
  Protected.f x,y,z
  x=GetEntityAttribute(entity,#PB_Entity_AngularVelocityX)
  y=GetEntityAttribute(entity,#PB_Entity_AngularVelocityY)
  z=GetEntityAttribute(entity,#PB_Entity_AngularVelocityZ)
  ApplyEntityTorque(entity,-x*f,-y*f,-z*f,#PB_World )
EndProcedure

Procedure menu()
  Protected p=4
  Macro DT(t1,t2="")
    DrawText(8,p,t1)
    DrawText(160,p,t2)
    p+20
  EndMacro
  CreateSprite(0,240,188,#PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(0))
  DrawingMode(#PB_2DDrawing_AllChannels)
  DrawingFont(FontID(0))
  Box(0,0,OutputWidth(),OutputHeight(),$44000000)
  DrawingMode(#PB_2DDrawing_AllChannels|#PB_2DDrawing_Outlined)
  Box(0,0,OutputWidth(),OutputHeight(),$44ffffff)
  BackColor($44000000)
  FrontColor($ffffffff)
  dt("[Arrow keys] / Mouse", "Yoke / Stick")
  dt("[Pad 2-1] / LMB-RMB","Rudder")
  dt("[Pad 0-1] / Wheel","Engine")
  dt("[F1]","Camera")
  dt("[F2]","Smoke")
  dt("[Esc]","Quit")
  dt("        Engine %")
  dt("        Altitude")
  dt("        Velocity")
  StopDrawing()
EndProcedure

Procedure affiche3d()
  Protected.f      cx=0.05,       cz=2.5,   czp=100,      alt=0.8+0.2
  Protected.f rotp,decx,decy,decz,poussee,fpoussee,fportance,v,vd,vp
  Protected.vector3 apos,pos,vit,dir,per,ftrainee,p,p0
  Protected i,ii,j,c,l,dis=0,vdis=1<<dis,smoke,shadows
  
  Macro KBdep(k1,k2):(Bool(KeyboardPushed(k1))-Bool(KeyboardPushed(k2))) :EndMacro
  
  menu()
  MouseLocate(ex/2,ey/2)
  vec3d(pos,EntityX(0),EntityY(0),EntityZ(0))
  Repeat 
    WindowEvent()
    ExamineMouse()
    ExamineKeyboard()
    If KeyboardReleased(#PB_Key_F1):dis=(dis+1)%3:vdis=1<<dis:EndIf
    If KeyboardReleased(#PB_Key_F2):smoke=1-smoke:vdis=4:DisableParticleEmitter(0,1-smoke):EndIf 
    
    vec3d(dir,-EntityDirectionX(0),-EntityDirectionY(0),-EntityDirectionZ(0))
    vec3d(p,0,-1,0)
    vec3d(p0,0,0,0)
    localtoworld(EntityID(0),p)
    localtoworld(EntityID(0),p0)
    sub3d(per,p,p0)
    apos=pos:vec3d(pos,EntityX(0),EntityY(0),EntityZ(0))
    sub3d(vit,pos,apos)
    mul3d(vit,60)
    v=lng3d(vit)
    vd=Pscalaire3d(vit,dir)
    vp=Pscalaire3d(vit,per)
    
    ; commandes
    decx-KBdep(#PB_Key_Left,#PB_Key_Right)*0.4+MouseDeltaX()*0.02:decx*0.8
    decz+KBdep(#PB_Key_Down,#PB_Key_Up   )*0.4+MouseDeltaY()*0.01:decz*0.8
    decy+KBdep(#PB_Key_Pad2,#PB_Key_Pad3 )*0.4+(MouseButton(1)-MouseButton(2))*0.4:decy*0.8
    poussee+KBdep(#PB_Key_Pad1,#PB_Key_Pad0)*1+MouseWheel()*10:If poussee<0:poussee=0:ElseIf poussee>100:poussee=100:EndIf
    
    ; portance    
    fportance=vd*vd*cz + vp*czp
    ApplyEntityForce(0, 0,fportance,0,decx*1,1,-0.15,#PB_Local )
    
    ; poussée
    fpoussee=poussee*10
    ApplyEntityForce(0, 0,0,fpoussee,0,0,1,#PB_Local)
    
    ; trainée
    ftrainee=vit:mul3d(ftrainee,-v*v*cx)
    vec3d(p,decy,decz,-2)
    vec3d(p0,0,0,0)
    localtoworld(EntityID(0),p)
    localtoworld(EntityID(0),p0)
    sub3d(p,p,p0)
    ApplyEntityForce(0,ftrainee\x,ftrainee\y,ftrainee\z,p\x,p\y,p\z,#PB_World )
    
    stabilise(0,800)
    
    rotp=poussee:RotateEntity(2,0,0,rotp,#PB_Relative)
    
    CameraFollow(0, EntityID(0), -180,EntityY(0)+vdis, 6*vdis, 0.02, 0.5)
    
    RenderWorld(16)
    StartDrawing(SpriteOutput(0)):DrawingFont(FontID(0)):DrawText(160,124,Str(poussee)+"  "):DrawText(160,144,StrF(pos\y,1)+"  "):DrawText(160,164,StrF(v,1)+"  "):StopDrawing()
    DisplayTransparentSprite(0,8,8)
    FlipBuffers()  
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure

init()
affiche3d()

Re: Physique - Avion

Publié : mar. 30/avr./2019 20:45
par SPH
Erreur ligne 324 :|

pb 5.70 lts 32 :idea:

Re: Physique - Avion

Publié : mar. 30/avr./2019 23:33
par Ollivier
@SPH

Erreur ligne 1 : Erreur non spécifiée !!

Re: Physique - Avion

Publié : mer. 01/mai/2019 8:01
par Guillot
chez moi, ça marche en x64 et x86

ça sent le caractere foireux

je vais rééditer le code

@ SPH : essaye en commentant la ligne 325 startdrawing...

Re: Physique - Avion

Publié : mer. 01/mai/2019 8:08
par Micoute
Superbe travail, merci professeur Shadoko pour le partage de cette magnifique œuvre.

Re: Physique - Avion

Publié : mer. 01/mai/2019 13:18
par SPH
Erreur ligne 324 :

Code : Tout sélectionner

RenderWorld(16)
Si je commente cette ligne, j'ai une scene de rectangles qui clignote :!:

Re: Physique - Avion

Publié : mer. 01/mai/2019 15:32
par Micoute
C'est curieux, pour une fois que ça fonctionne très bien chez moi, apparemment on n'a pas le même sous-système, moi c'est OpenGL.

Re: Physique - Avion

Publié : mer. 01/mai/2019 18:05
par SPH
Micoute a écrit :C'est curieux, pour une fois que ça fonctionne très bien chez moi, apparemment on n'a pas le même sous-système, moi c'est OpenGL.
Si je ne m'abuse, on a un sous systeme uniquement si on compile le code, non :?:
Moi, j'ai lancé le code depuis l'IDE 8)

Re: Physique - Avion

Publié : jeu. 02/mai/2019 6:49
par Micoute
Bonjour SPH,

l'IDE ou Environnement de Développement Intégré, crée toujours un exécutable qui se nomme PureBasic_Compilateur0.exe, ou plus s'il y a d'autres programmes, qu'il exécute selon le sous-système de ton système.

Re: Physique - Avion

Publié : jeu. 02/mai/2019 9:16
par SPH
Micoute a écrit :Bonjour SPH,

l'IDE ou Environnement de Développement Intégré, crée toujours un exécutable qui se nomme PureBasic_Compilateur0.exe, ou plus s'il y a d'autres programmes, qu'il exécute selon le sous-système de ton système.
Ce qui veux dire qu'il faut aller dans COMPILATEUR/OPTION DU COMPIL renseigner le sous system meme si on n'utilise que l'ide avec un .PB ? (c'est nouveau pour moi tout ca)

P.S. : a propos de sous system, je suis surpris que l'on doive l'ecrire au clavier. Une liste deroulante pre remplis (ou des boutons radio) me semblerais plus logique :idea:

Re: Physique - Avion

Publié : jeu. 02/mai/2019 9:55
par Micoute
Tout à fait d'accord, donc je plussoie.

Re: Physique - Avion

Publié : jeu. 02/mai/2019 10:41
par Guillot
d'accord avec SPH

au niveau des plantages, avec la 3d y'a 2 causes fréquentes; les ombres et les sprites:

1) les ombres:
ligne 224
- essayer en remplaçant PB_Shadow_Additive par PB_Shadow_Modulative (j'y crois pas trop...)
- les désactiver (commenter la ligne)

2) les sprites:
commenter les lignes
224 : menu()

325 : StartDrawing...
326 : DisplayTransparentSprite...

Re: Physique - Avion

Publié : jeu. 02/mai/2019 15:55
par falsam
Testé avec PB 5.70 LTS (x64) Aucun souci. Bravo et merci pour de nous faire partager tes créations.

Re: Physique - Avion

Publié : ven. 04/oct./2019 9:59
par Mesa
Oui, bravo !

Je vais montrer ce simulateur à mon école de pilotage !

Mais avant, j'aimerais ajouter des ailerons, entre autre, et les animer en temps réel en appuyant sur une touche clavier, mais je n'y arrive pas.

Je bataille avec les hingejoint mais sans succès, et ce n'est peut-être pas la solution.

Quelqu'un peut me mettre sur la voie, svp ?

Merci par avance.

Mesa.

Re: Physique - Avion

Publié : ven. 04/oct./2019 15:07
par Kwai chang caine
Toujours pas compris comment tu arrives à créer des super beaux et étonnants objets seulement avec des lignes de codes 8O
Ca me fait planer...merci de ce nouveau partage 8)