OpenGL et les polygones
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

OpenGL et les polygones



  1. #1
    SPH

    OpenGL et les polygones


    ------

    Salut a tous,

    Je programme un éditeur de polygones. Pour cela, j'utilise une fenetre OpenGL et ce code :
    Code:
      glBegin_(#GL_POLYGON)
      glColor4f_(1,1,1,1)
      glVertex2f_(22,11)
      glVertex2f_(500,66)
      glVertex2f_(33,755)
      glEnd_()
    Mais voila, on ne peux pas faire de polygones concaves ! (un croissant de lune par exemple)
    Voici mon programme : http://xmas.free.fr/jeu/Another_earth.exe

    Je me demandais s'il y avait une instructions qui fasse des polygones concaves...

    Grand merci

    -----

  2. #2
    Garion

    Re : OpenGL et les polygones

    Il serait intéressant de voir le reste du code quand tu traces car normalement, il ne devrait pas y avoir de problème.

  3. #3
    SPH

    Lightbulb Re : OpenGL et les polygones

    Oui, pas de probleme.
    Voici mon code qui permet de tracer des polygones a la souris (Le code compilé est celui ci : http://xmas.free.fr/jeu/Another_earth.exe ).
    Je trace une etoile a la ligne 88 mais elle a un probleme d'affichage...
    (Vous pouvez aussi tracer une etoile avec le programme '.exe' que je vous ai donné plus haut. Vous verrez l'étrangeté de la chose)
    Code:
    ;;;;;;;;;;;;;;;;;;;;;;
    
    ExamineDesktops()
    xxx=DesktopWidth(0)
    yyy=DesktopHeight(0)
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    win=OpenWindow(0, 0, 0,xxx,yyy, "Polygons_Maker",#PB_Window_Maximize|#PB_Window_BorderLess)
    If win=0
      Beep_(500,250) : Delay(150) : Beep_(500,250)
      Debug ("OpenWindow() impossible")
      End
    EndIf
    
    screenGL=OpenGLGadget(1,0,0,xxx,yyy)
    If screenGL=0
      Beep_(500,250) : Delay(150) : Beep_(500,250)
      Debug ("OpenGLGadget() impossible")
      End
    EndIf
    screenW=GadgetWidth(1)
    screenH=GadgetHeight(1)
    ;SetupGL(screenW, screenH)
    
    ;;;;;;;;;;;;;;;;;;
    
    glOrtho_(0,xxx,yyy,0,-1,1)
    glMatrixMode_(#GL_MODELVIEW)
    glLoadIdentity_()
    glClear_(0)
    
    ; timer=ElapsedMilliseconds()
    ; timer=ElapsedMilliseconds()-timer
    
    
    AddKeyboardShortcut(0,  #PB_Shortcut_Escape, 666)
    AddKeyboardShortcut(0,  #PB_Shortcut_H, 8) ; hide/show
    
    AddKeyboardShortcut(0,  #PB_Shortcut_Add, 100) ; alpha+0.01
    AddKeyboardShortcut(0,  #PB_Shortcut_Subtract, 101) ; alpha-0.01
    AddKeyboardShortcut(0,  #PB_Shortcut_Multiply, 102) ; alpha=0.5
    AddKeyboardShortcut(0,  #PB_Shortcut_Divide, 103)   ; NO alpha
    
    AddKeyboardShortcut(0,  #PB_Shortcut_Pad1, 110) ; rouge-0.02
    AddKeyboardShortcut(0,  #PB_Shortcut_Pad2, 111) ; rouge+0.02
    AddKeyboardShortcut(0,  #PB_Shortcut_Pad4, 112) ; vert-0.02
    AddKeyboardShortcut(0,  #PB_Shortcut_Pad5, 113) ; vert+0.02
    AddKeyboardShortcut(0,  #PB_Shortcut_Pad7, 114) ; bleu-0.02
    AddKeyboardShortcut(0,  #PB_Shortcut_Pad8, 115) ; bleu+0.02
    
    AddKeyboardShortcut(0,  #PB_Shortcut_Pad3, 116) ; rouge=0.5
    AddKeyboardShortcut(0,  #PB_Shortcut_Pad6, 117) ; vert=0.5
    AddKeyboardShortcut(0,  #PB_Shortcut_Pad9, 118) ; bleu=0.5
    
    
    
    hide=0
    alpha.f=0.5
    rouge.f=0.5
    vert.f=0.5
    bleu.f=0.5
    no_alpha=0
    
    Dim poly_x(1000)
    Dim poly_y(1000)
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
    Repeat
      
      glClear_ (#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
      
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      
      ;- polygone blanc
      glBegin_(#GL_POLYGON)
      glColor4f_(1,1,1,1)
      glVertex2f_(22,11)
      glVertex2f_(500,66)
      glVertex2f_(33,755)
      glEnd_()
      
      
      
      ;- LE POLYGONE EN ETOILE :
      glEnable_(#GL_BLEND)
      glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
     
      glBegin_(#GL_POLYGON)
      glColor4f_(0,1,1,0.5)
      glVertex2f_(350,110)
      glVertex2f_(500,450)
      glVertex2f_(150,260)
      glVertex2f_(550,260)
      glVertex2f_(200,450)
      glEnd_()
      
      
      ;;;;;;;;;;;;;;;;;;;
      
      Event = WaitWindowEvent()
      Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 1
              Resx = GetGadgetAttribute(1, #PB_OpenGL_MouseX)
              Resy = GetGadgetAttribute(1, #PB_OpenGL_MouseY)
              ;;;;;;;          
              Select EventType()
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              
                Case #PB_EventType_LeftClick
                  Beep_(1500,55) ;Debug "Clic avec le bouton gauche de la souris"
                  poly_x(0)+1
                  poly_x(poly_x(0))=Resx 
                  poly_y(poly_x(0))=Resy
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                Case #PB_EventType_RightDoubleClick 
                  If poly_x(0)>0
                    Beep_(500,400) ;: Debug "Double-clic avec le bouton droit de la souris"
                    Dim poly_x(1000)
                    Dim poly_y(1000)
                  EndIf
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              
                Case #PB_EventType_RightClick
                  If poly_x(0)>0
                    Beep_(500,55) ;Debug "Clic avec le bouton droit de la souris"
                    poly_x(0)-1
                  EndIf
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              
                Case #PB_EventType_MiddleButtonDown
                  If poly_x(0)>2
                    Beep_(3000,55) : Delay(150) : Beep_(3000,55) ;Debug "Clic avec le bouton centre de la souris"
                    
                  EndIf
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              
              EndSelect
          EndSelect
        Case #PB_Event_Menu
          Select EventMenu()
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;        
            Case 666
              End
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 8
              hide+1 : hide%2
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 100
              alpha+0.01
              If alpha>1
                alpha=1
              EndIf
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 101
              alpha-0.01
              If alpha<0
                alpha=0
              EndIf
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 102
              alpha=0.5
              no_alpha=0
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 103
              no_alpha+1 : no_alpha%2          
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 110
              rouge-0.02
              If rouge<0
                rouge=0
              EndIf
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 111
              rouge+0.02
              If rouge>1
                rouge=1
              EndIf
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 112
              vert-0.02
              If vert<0
                vert=0
              EndIf
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 113
              vert+0.02
              If vert>1
                vert=1
              EndIf
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 114
              bleu-0.02
              If bleu<0
                bleu=0
              EndIf
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 115
              bleu+0.02
              If bleu>1
                bleu=1
              EndIf
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 116
              rouge=0.5
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 117
              vert=0.5
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
            Case 118
              bleu=0.5
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         
          EndSelect
      EndSelect
      
      ;;;;;;;;;;;;;;;;
      ;;;;;;;;;;;;;;;;
      
      ;;;;;;;;;;;;;;;;
      ;;;;;;;;;;;;;;;;
      
      
      If poly_x(0)>1; And 0=1
        glBegin_(#GL_POLYGON)
        If no_alpha=1
          glColor4f_(rouge,vert,bleu,1)
        Else
          glColor4f_(rouge,vert,bleu,alpha)
        EndIf
        
        For i=1 To poly_x(0)
          glVertex2f_(poly_x(i),poly_y(i))
        Next
        If hide=0
          glVertex2f_(Resx,Resy) ;: Debug Resx : Debug Resy : Debug "----------"
        EndIf
        
        glEnd_()
      EndIf
      
      SetGadgetAttribute(1,#PB_OpenGL_FlipBuffers,#True)
      
    ForEver
    
    ;SPH : 38ms
    ;Falsam : 695ms

  4. #4
    umfred

    Re : OpenGL et les polygones

    peut-être voir de ce côté => http://www.songho.ca/opengl/gl_tessellation.html

  5. A voir en vidéo sur Futura

Discussions similaires

  1. La parabole des polygones
    Par shokin dans le forum Science ludique : la science en s'amusant
    Réponses: 6
    Dernier message: 13/06/2016, 10h40
  2. [ada]Gtk+opengl
    Par galge dans le forum Programmation et langages, Algorithmique
    Réponses: 6
    Dernier message: 24/10/2015, 19h04
  3. Addition de polygones
    Par meliotte dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 03/07/2014, 14h50
  4. Polygones
    Par dgidgi dans le forum Science ludique : la science en s'amusant
    Réponses: 15
    Dernier message: 08/02/2011, 20h10
  5. Opengl
    Par invite591b481e dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 17/05/2010, 11h39