как определить контур фигуры PyOpenGL

У меня есть одна проблема, у меня есть много сфер в моей сцене с PyOpenGL, но я не могу отличить одну сферу от другой.

Как можно создать контур над фигурой?.


person Cristian    schedule 07.11.2012    source источник


Ответы (1)


Простой способ создания контуров или силуэтов вокруг сетки с использованием фиксированного конвейера (‹ OpenGL-3.x) приведен ниже:

  1. Отключить освещение: glDisable(GL_LIGHTING)
  2. Выберите цвет для силуэта: glColor(R, G, B)
  3. Включите отсечение передней грани: glCullFace(GL_FRONT)
  4. Масштабируйте сетку (сферу) на небольшой процент: glScale(sx, sy, sz)
  5. визуализируйте сферу, как обычно: glutSolidSphere(radius, slices, stacks)

Используя основной профиль OpenGL 3.x или более поздней версии, вы будете выполнять точно такие же операции, но вместо этого в вершинном шейдере.

Код, необходимый для достижения этого с использованием фиксированного конвейера, очень прост:

    # Render silhouette around object
    glPushMatrix()
    glCullFace(GL_FRONT) # Front face culling makes us render only the inside of the sphere, which gives the illusion of a silhouette
    glScale(1.04, 1.04, 1.04) # This makes the silhouette show up around the object
    glDisable(GL_LIGHTING) # We only want a plain single colour silhouette
    glColor(0., 1., 0.) # Silhouette colour
    glutSolidSphere(2,20,20) # This can be any object, not limited to spheres (even non-convex objects)
    glPopMatrix()

Ниже приведен простой пример программы PyOpenGL, отображающей сферу с силуэтом, на основе примера GLUT, найденного по адресу http://code.activestate.com/recipes/325391-open-a-glut-window-and-draw-a-sphere-using-pythono /:

from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
import sys

name = 'ball_glut'

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
    glutInitWindowSize(400,400)
    glutCreateWindow(name)

    glClearColor(0.,0.,1.,1.)
    glShadeModel(GL_SMOOTH)
    glEnable(GL_CULL_FACE)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_LIGHTING)
    lightZeroPosition = [10.,4.,10.,1.]
    lightZeroColor = [1.0,1.0,1.0,1.0]
    glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition)
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor)
    glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1)
    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05)
    glEnable(GL_LIGHT0)
    glutDisplayFunc(display)
    glMatrixMode(GL_PROJECTION)
    gluPerspective(40.,1.,1.,40.)
    glMatrixMode(GL_MODELVIEW)
    gluLookAt(0,0,10,
              0,0,0,
              0,1,0)
    glPushMatrix()
    glutMainLoop()
    return

def display():
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)

    # Render sphere normally
    glPushMatrix()
    color = [1.0,0.,0.,1.]
    glMaterialfv(GL_FRONT,GL_DIFFUSE,color)
    glCullFace(GL_BACK)
    glEnable(GL_LIGHTING)
    glutSolidSphere(2,20,20)

    # Render silhouette around object
    glPushMatrix()
    glCullFace(GL_FRONT) # Front face culling makes us render only the inside of the sphere, which gives the illusion of a silhouette
    glScale(1.04, 1.04, 1.04) # This makes the silhouette show up around the object
    glDisable(GL_LIGHTING) # We only want a plain fixed colour silhouette
    glColor(0., 1., 0.) # Silhouette colour
    glutSolidSphere(2,20,20) # This can be any object, not limited to spheres (even non-convex objects)
    glPopMatrix()

    glPopMatrix()
    glutSwapBuffers() # Display results.
    return

if __name__ == '__main__': main()
person Joakim Nohlgård    schedule 07.11.2012