IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Aide pour OpenGL


Sujet :

PyQt Python

  1. #1
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Aide pour OpenGL
    Bonjour,
    j'ai essayé d'adapter le très bon code d'exemple "Hello GL" proposé par PyQT.
    Je voudrais tracer deux triangles, l'un en rouge et l'autre en bleu. Malheureusement je n'y arrive pas.

    Toute info. est la bienvenue.

    Voici le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    #!/usr/bin/env python
     
    """PyQt4 port of the opengl/hellogl example from Qt v4.x"""
     
    import sys
    import math
    from PyQt4 import QtCore, QtGui, QtOpenGL
     
    try:
       from OpenGL import GL
    except ImportError:
       app = QtGui.QApplication(sys.argv)
       QtGui.QMessageBox.critical(None, "OpenGL hellogl",
                               "PyOpenGL must be installed to run this example.",
                               QtGui.QMessageBox.Ok | QtGui.QMessageBox.Default,
                               QtGui.QMessageBox.NoButton)
       sys.exit(1)
     
     
    class Window(QtGui.QWidget):
       def __init__(self, parent=None):
           QtGui.QWidget.__init__(self, parent)
     
           self.glWidget = GLWidget()
     
           self.xSlider = self.createSlider(QtCore.SIGNAL("xRotationChanged(int)"),
                                            self.glWidget.setXRotation)
           self.ySlider = self.createSlider(QtCore.SIGNAL("yRotationChanged(int)"),
                                            self.glWidget.setYRotation)
           self.zSlider = self.createSlider(QtCore.SIGNAL("zRotationChanged(int)"),
                                            self.glWidget.setZRotation)
     
           mainLayout = QtGui.QHBoxLayout()
           mainLayout.addWidget(self.glWidget)
           mainLayout.addWidget(self.xSlider)
           mainLayout.addWidget(self.ySlider)
           mainLayout.addWidget(self.zSlider)
           self.setLayout(mainLayout)
     
           self.xSlider.setValue(15 * 16)
           self.ySlider.setValue(345 * 16)
           self.zSlider.setValue(0 * 16)
     
           self.setWindowTitle(self.tr("Hello GL"))
     
       def createSlider(self, changedSignal, setterSlot):
           slider = QtGui.QSlider(QtCore.Qt.Vertical)
     
           slider.setRange(0, 360 * 16)
           slider.setSingleStep(16)
           slider.setPageStep(15 * 16)
           slider.setTickInterval(15 * 16)
           slider.setTickPosition(QtGui.QSlider.TicksRight)
     
           self.glWidget.connect(slider, QtCore.SIGNAL("valueChanged(int)"), setterSlot)
           self.connect(self.glWidget, changedSignal, slider, QtCore.SLOT("setValue(int)"))
     
           return slider
     
     
    class GLWidget(QtOpenGL.QGLWidget):
       def __init__(self, parent=None):
           QtOpenGL.QGLWidget.__init__(self, parent)
     
           self.object = 0
           self.xRot = 0
           self.yRot = 0
           self.zRot = 0
     
           self.lastPos = QtCore.QPoint()
     
           self.trolltechGreen = QtGui.QColor.fromCmykF(0.40, 0.0, 1.0, 0.0)
           self.trolltechPurple = QtGui.QColor.fromCmykF(0.39, 0.39, 0.0, 0.0)
     
       def xRotation(self):
           return self.xRot
     
       def yRotation(self):
           return self.yRot
     
       def zRotation(self):
           return self.zRot
     
       def minimumSizeHint(self):
           return QtCore.QSize(50, 50)
     
       def sizeHint(self):
           return QtCore.QSize(400, 400)
     
       def setXRotation(self, angle):
           angle = self.normalizeAngle(angle)
           if angle != self.xRot:
               self.xRot = angle
               self.emit(QtCore.SIGNAL("xRotationChanged(int)"), angle)
               self.updateGL()
     
       def setYRotation(self, angle):
           angle = self.normalizeAngle(angle)
           if angle != self.yRot:
               self.yRot = angle
               self.emit(QtCore.SIGNAL("yRotationChanged(int)"), angle)
               self.updateGL()
     
       def setZRotation(self, angle):
           angle = self.normalizeAngle(angle)
           if angle != self.zRot:
               self.zRot = angle
               self.emit(QtCore.SIGNAL("zRotationChanged(int)"), angle)
               self.updateGL()
     
       def initializeGL(self):
           self.qglClearColor(self.trolltechPurple.dark())
           self.object = self.makeObject()
           GL.glShadeModel(GL.GL_FLAT)
           GL.glEnable(GL.GL_DEPTH_TEST)
           GL.glEnable(GL.GL_CULL_FACE)
     
       def paintGL(self):
           GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
           GL.glLoadIdentity()
           GL.glTranslated(0.0, 0.0, -10.0)
           GL.glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
           GL.glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
           GL.glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
           GL.glCallList(self.object)
     
       def resizeGL(self, width, height):
           side = min(width, height)
           GL.glViewport((width - side) / 2, (height - side) / 2, side, side)
     
           GL.glMatrixMode(GL.GL_PROJECTION)
           GL.glLoadIdentity()
           GL.glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0)
           GL.glMatrixMode(GL.GL_MODELVIEW)
     
       def mousePressEvent(self, event):
           self.lastPos = QtCore.QPoint(event.pos())
     
       def mouseMoveEvent(self, event):
           dx = event.x() - self.lastPos.x()
           dy = event.y() - self.lastPos.y()
     
           if event.buttons() & QtCore.Qt.LeftButton:
               self.setXRotation(self.xRot + 8 * dy)
               self.setYRotation(self.yRot + 8 * dx)
           elif event.buttons() & QtCore.Qt.RightButton:
               self.setXRotation(self.xRot + 8 * dy)
               self.setZRotation(self.zRot + 8 * dx)
     
           self.lastPos = QtCore.QPoint(event.pos())
     
       def makeObject(self):
           genList = GL.glGenLists(1)
           GL.glNewList(genList, GL.GL_COMPILE)
     
           GL.glBegin(GL.GL_QUADS)
     
           x1 = +0.06
           y1 = +0.06
           z1 = -0.54
     
           x2 = +0.14
           y2 = +0.06
           z2 = -0.54
     
           x3 = +0.08
           y3 = +0.00
           z3 = -0.54
     
                  self.triangle(x1, y1, z1, x2, y2, z2, x3, y3, z3,255,0,0)
     
     
           GL.glBegin(GL.GL_QUADS)
                  x1 = +0.06
           y1 = +0.06
           z1 = 0.54
                  x2 = +0.14
           y2 = +0.06
           z2 = 0.54
                  x3 = +0.08
           y3 = +0.00
           z3 = 0.54
                  self.triangle(x1, y1, z1, x2, y2, z2, x3, y3, z3,0,0,255)
                  GL.glEnd()
           GL.glEndList()
     
           return genList
     
       def triangle(self, x1, y1, z1, x2, y2, z2, x3, y3, z3,r,g,b):
           self.qglColor(QtGui.QColor(r,g,b))
     
           GL.glVertex3d(x1, y1, z1)
           GL.glVertex3d(x2, y2, z2)
           GL.glVertex3d(x3, y3, z3)
     
     
       def extrude(self, x1, y1, x2, y2):
           self.qglColor(self.trolltechGreen.dark(250 + int(100 * x1)))
     
           GL.glVertex3d(x1, y1, +0.05)
           GL.glVertex3d(x2, y2, +0.05)
           GL.glVertex3d(x2, y2, -0.05)
           GL.glVertex3d(x1, y1, -0.05)
     
       def normalizeAngle(self, angle):
           while angle < 0:
               angle += 360 * 16
           while angle > 360 * 16:
               angle -= 360 * 16
           return angle
     
     
    if __name__ == '__main__':
       app = QtGui.QApplication(sys.argv)
       window = Window()
       window.show()
       sys.exit(app.exec_())

  2. #2
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Récupérer des messages sur un compte gmail
    En fait il faut changer makeObject et triangle comme suit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
        def makeObject(self):
            genList = GL.glGenLists(1)
            GL.glNewList(genList, GL.GL_COMPILE)
     
            x1 = +0.06
            y1 = +0.06
            z1 = -0.54
     
            x2 = +0.14
            y2 = +0.06
            z2 = -0.54
     
            x3 = +0.08
            y3 = +0.00
            z3 = -0.54
     
     
            self.triangle(x1, y1, z1, x2, y2, z2, x3, y3, z3,255,0,0)
     
     
            x1 = +0.06
            y1 = +0.06
            z1 = 0.54
     
            x2 = +0.14
            y2 = +0.06
            z2 = 0.54
     
            x3 = +0.08
            y3 = +0.00
            z3 = 0.54
     
            self.triangle(x1, y1, z1, x2, y2, z2, x3, y3, z3,0,0,255)
     
            GL.glEndList()
     
            return genList
     
        def triangle(self, x1, y1, z1, x2, y2, z2, x3, y3, z3,r,g,b):
            self.qglColor(QtGui.QColor(r,g,b))
            GL.glBegin(GL.GL_TRIANGLES)
            GL.glVertex3d(x1, y1, z1)
            GL.glVertex3d(x2, y2, z2)
            GL.glVertex3d(x3, y3, z3)
            GL.glEnd()

  3. #3
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Rapide ce OpenGL
    Le code suivant produit un hideux dessin mais qui contient plein de triangles. J'ai testé avec 6000 est la fabrication est très rapide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    #!/usr/bin/env python
     
    """PyQt4 port of the opengl/hellogl example from Qt v4.x"""
     
    import sys
    import math, random
    from PyQt4 import QtCore, QtGui, QtOpenGL
     
    try:
        from OpenGL import GL
    except ImportError:
        app = QtGui.QApplication(sys.argv)
        QtGui.QMessageBox.critical(None, "OpenGL hellogl",
                                "PyOpenGL must be installed to run this example.",
                                QtGui.QMessageBox.Ok | QtGui.QMessageBox.Default,
                                QtGui.QMessageBox.NoButton)
        sys.exit(1)
     
     
    class Window(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
     
            self.glWidget = GLWidget()
     
            self.xSlider = self.createSlider(QtCore.SIGNAL("xRotationChanged(int)"),
                                             self.glWidget.setXRotation)
            self.ySlider = self.createSlider(QtCore.SIGNAL("yRotationChanged(int)"),
                                             self.glWidget.setYRotation)
            self.zSlider = self.createSlider(QtCore.SIGNAL("zRotationChanged(int)"),
                                             self.glWidget.setZRotation)
     
            mainLayout = QtGui.QHBoxLayout()
            mainLayout.addWidget(self.glWidget)
            mainLayout.addWidget(self.xSlider)
            mainLayout.addWidget(self.ySlider)
            mainLayout.addWidget(self.zSlider)
            self.setLayout(mainLayout)
     
            self.xSlider.setValue(15 * 16)
            self.ySlider.setValue(345 * 16)
            self.zSlider.setValue(0 * 16)
     
            self.setWindowTitle(self.tr("Hello GL"))
     
        def createSlider(self, changedSignal, setterSlot):
            slider = QtGui.QSlider(QtCore.Qt.Vertical)
     
            slider.setRange(0, 360 * 16)
            slider.setSingleStep(16)
            slider.setPageStep(15 * 16)
            slider.setTickInterval(15 * 16)
            slider.setTickPosition(QtGui.QSlider.TicksRight)
     
            self.glWidget.connect(slider, QtCore.SIGNAL("valueChanged(int)"), setterSlot)
            self.connect(self.glWidget, changedSignal, slider, QtCore.SLOT("setValue(int)"))
     
            return slider
     
     
    class GLWidget(QtOpenGL.QGLWidget):
        def __init__(self, parent=None):
            QtOpenGL.QGLWidget.__init__(self, parent)
     
            self.object = 0
            self.xRot = 0
            self.yRot = 0
            self.zRot = 0
     
            self.lastPos = QtCore.QPoint()
     
            self.trolltechGreen = QtGui.QColor.fromCmykF(0.40, 0.0, 1.0, 0.0)
            self.trolltechPurple = QtGui.QColor.fromCmykF(0.39, 0.39, 0.0, 0.0)
     
        def xRotation(self):
            return self.xRot
     
        def yRotation(self):
            return self.yRot
     
        def zRotation(self):
            return self.zRot
     
        def minimumSizeHint(self):
            return QtCore.QSize(50, 50)
     
        def sizeHint(self):
            return QtCore.QSize(400, 400)
     
        def setXRotation(self, angle):
            angle = self.normalizeAngle(angle)
            if angle != self.xRot:
                self.xRot = angle
                self.emit(QtCore.SIGNAL("xRotationChanged(int)"), angle)
                self.updateGL()
     
        def setYRotation(self, angle):
            angle = self.normalizeAngle(angle)
            if angle != self.yRot:
                self.yRot = angle
                self.emit(QtCore.SIGNAL("yRotationChanged(int)"), angle)
                self.updateGL()
     
        def setZRotation(self, angle):
            angle = self.normalizeAngle(angle)
            if angle != self.zRot:
                self.zRot = angle
                self.emit(QtCore.SIGNAL("zRotationChanged(int)"), angle)
                self.updateGL()
     
        def initializeGL(self):
            self.qglClearColor(self.trolltechPurple.dark())
            self.object = self.makeObject()
            GL.glShadeModel(GL.GL_FLAT)
            GL.glEnable(GL.GL_DEPTH_TEST)
            GL.glEnable(GL.GL_CULL_FACE)
     
        def paintGL(self):
            GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
            GL.glLoadIdentity()
            GL.glTranslated(0.0, 0.0, -10.0)
            GL.glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
            GL.glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
            GL.glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
            GL.glCallList(self.object)
     
        def resizeGL(self, width, height):
            side = min(width, height)
            GL.glViewport((width - side) / 2, (height - side) / 2, side, side)
     
            GL.glMatrixMode(GL.GL_PROJECTION)
            GL.glLoadIdentity()
            GL.glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0)
            GL.glMatrixMode(GL.GL_MODELVIEW)
     
        def mousePressEvent(self, event):
            self.lastPos = QtCore.QPoint(event.pos())
     
        def mouseMoveEvent(self, event):
            dx = event.x() - self.lastPos.x()
            dy = event.y() - self.lastPos.y()
     
            if event.buttons() & QtCore.Qt.LeftButton:
                self.setXRotation(self.xRot + 8 * dy)
                self.setYRotation(self.yRot + 8 * dx)
            elif event.buttons() & QtCore.Qt.RightButton:
                self.setXRotation(self.xRot + 8 * dy)
                self.setZRotation(self.zRot + 8 * dx)
     
            self.lastPos = QtCore.QPoint(event.pos())
     
        def makeObject(self):
            genList = GL.glGenLists(1)
            GL.glNewList(genList, GL.GL_COMPILE)
     
            x=[0,0,0]
            y=[0,0,0]
            z=[0,0,0]
     
            for i in range(1000):
                for j in range(3):
                    x[j] = -0.16 + 0.16*random.random()
                    y[j] = +0.06 - 0.06*random.random()
                    z[j] = -0.54 + 0.54*random.random()
     
                self.triangle(x[0], y[0], z[0], x[1], y[1], z[1], x[2], y[2], z[2], random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
     
            GL.glEndList()
     
            return genList
     
        def triangle(self, x1, y1, z1, x2, y2, z2, x3, y3, z3,r,g,b):
            self.qglColor(QtGui.QColor(r,g,b))
            GL.glBegin(GL.GL_TRIANGLES)
            GL.glVertex3d(x1, y1, z1)
            GL.glVertex3d(x2, y2, z2)
            GL.glVertex3d(x3, y3, z3)
            GL.glEnd()
     
     
     
        def extrude(self, x1, y1, x2, y2):
            self.qglColor(self.trolltechGreen.dark(250 + int(100 * x1)))
     
            GL.glVertex3d(x1, y1, +0.05)
            GL.glVertex3d(x2, y2, +0.05)
            GL.glVertex3d(x2, y2, -0.05)
            GL.glVertex3d(x1, y1, -0.05)
     
        def normalizeAngle(self, angle):
            while angle < 0:
                angle += 360 * 16
            while angle > 360 * 16:
                angle -= 360 * 16
            return angle
     
     
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.show()
        sys.exit(app.exec_())

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour OpenGL 4
    Par Stéphane-M dans le forum OpenGL
    Réponses: 3
    Dernier message: 08/04/2011, 13h11
  2. Demande d'aide pour une formation SDL/OpenGL.
    Par Squalthor dans le forum API graphiques
    Réponses: 14
    Dernier message: 13/07/2006, 20h24
  3. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo