2016-07-28 30 views
0

Iは、フォーム内のポリゴンを有する:Pyopenglテッセレーションポリゴン

[(1,2)、(2,4)、(3,4)、(5,6)]

私がテッセレーションを必要としますそれらを描くが、glutessはあまりにも複雑です。 OpenGLは凸多角形を扱うことができません。

私は私のようなものが必要だと思う:

http://www.math.uiuc.edu/~gfrancis/illimath/windows/aszgard_mini/pylibs/OpenGLContext/scenegraph/polygontessellator.py

をしかし、私はそれを使用する方法を理解していません。誰かが私に明確な例を教えてもらえますか?

それはそれは別のプロジェクトに統合する必要があるため、代わりに(pygameのなどが動作しません)

をpyopengl使用する必要があり、ラインアレイからtrimeshをbuidlingの方法は何ですか?

答えて

0

私は実際には、Pythonでベクターグラフィックスを描画するために同じことに取り組んでいます!このサンプルコードをまとめると、gluTesselatorを理解するのに便利なthis resourceが見つかりました(このリンクはPythonを使用していませんが)。以下は、私が通常使用するカスタムクラスを持たず、簡潔にするために(ゆっくりとひどい)即時モードを使用する2つの穴(GLUのない生のOpenGLの潜在的な制限)を持つ凹面ポリゴンをレンダリングするサンプルコードです。 triangulate関数には、gluTesselatorを作成するための関連コードが含まれています。

from OpenGL.GLU import * 
from OpenGL.GL import * 
from pygame.locals import * 
import pygame 
import sys 

def triangulate(polygon, holes=[]): 
    """ 
    Returns a list of triangles. 
    Uses the GLU Tesselator functions! 
    """ 
    vertices = [] 
    def edgeFlagCallback(param1, param2): pass 
    def beginCallback(param=None): 
     vertices = [] 
    def vertexCallback(vertex, otherData=None): 
     vertices.append(vertex[:2]) 
    def combineCallback(vertex, neighbors, neighborWeights, out=None): 
     out = vertex 
     return out 
    def endCallback(data=None): pass 

    tess = gluNewTess() 
    gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD) 
    gluTessCallback(tess, GLU_TESS_EDGE_FLAG_DATA, edgeFlagCallback)#forces triangulation of polygons (i.e. GL_TRIANGLES) rather than returning triangle fans or strips 
    gluTessCallback(tess, GLU_TESS_BEGIN, beginCallback) 
    gluTessCallback(tess, GLU_TESS_VERTEX, vertexCallback) 
    gluTessCallback(tess, GLU_TESS_COMBINE, combineCallback) 
    gluTessCallback(tess, GLU_TESS_END, endCallback) 
    gluTessBeginPolygon(tess, 0) 

    #first handle the main polygon 
    gluTessBeginContour(tess) 
    for point in polygon: 
     point3d = (point[0], point[1], 0) 
     gluTessVertex(tess, point3d, point3d) 
    gluTessEndContour(tess) 

    #then handle each of the holes, if applicable 
    if holes != []: 
     for hole in holes: 
      gluTessBeginContour(tess) 
      for point in hole: 
       point3d = (point[0], point[1], 0) 
       gluTessVertex(tess, point3d, point3d) 
      gluTessEndContour(tess) 

    gluTessEndPolygon(tess) 
    gluDeleteTess(tess) 
    return vertices 

if __name__ == "__main__": 
    width, height = 550, 400 
    pygame.init() 
    pygame.display.set_mode((width, height), DOUBLEBUF|OPENGL) 
    pygame.display.set_caption("Tesselation Demo") 
    clock = pygame.time.Clock() 
    glClear(GL_COLOR_BUFFER_BIT) 
    glClear(GL_DEPTH_BUFFER_BIT) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    glOrtho(0, width, height, 0, -1, 1)#flipped so top-left = (0, 0)! 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 

    #define the polygon and some holes 
    polygon = [(0, 0), (550, 0), (550, 400), (275, 200), (0, 400)] 
    hole1 = [(10, 10), (10, 100), (100, 100), (100, 10)] 
    hole2 = [(300, 50), (350, 100), (400, 50), (350, 200)] 
    holes = [hole1, hole2] 
    vertices = triangulate(polygon, holes=holes) 

    while True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       sys.exit() 

     glColor(1, 0, 0) 
     glBegin(GL_TRIANGLES) 
     for vertex in vertices: 
      glVertex(*vertex) 
     glEnd() 

     pygame.display.flip() 
     clock.tick_busy_loop(60) 

上記のコードの出力は、(私が直接、画像を含めるために十分な評判を持っていない)thisのようになります。

また、上記のコードサンプルにpygameとpygameを併用することもできます。しかし、私は個人的には、以前のsdl 1.2に基づいて放棄されたpygameではなく、自分のアプリケーション用のウィンドウを提供するためにpysdl2を使用することを好みます。私はデモで作業するのがより簡潔であるため、上記のサンプルではpygameしか使用していません。

関連する問題