2017-12-18 9 views
0

私はOpenGLとPygameツールを使ってpythonでtesseract(4Dオブジェクト)のモデルを作ろうとしていました。幸いにも、私は見通しを得ました(立方体の中に立方体を持っています)が、内側の立方体の頂点を外側の頂点と結合できませんでした。 これは私のコードです。python-openglの 'inner cube'と 'outer cube'(4 Dimensionalオブジェクト)の頂点を結合するにはどうすればいいですか?

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

vertices = ((1,-1,-1),(1,1,-1),(-1,1,-1),(-1,-1,-1),(1,-1,1),(1,1,1),(-1,-1,1),(-1,1,1)) 
vertices1 = ((2,-2,-2),(2,2,-2),(-2,2,-2),(-2,-2,-2),(2,-2,2),(2,2,2),(-2,-2,2),(-2,2,2)) 

edges = ((0,1),(0,3),(0,4),(2,1),(2,3),(2,7),(6,3),(6,4),(6,7),(5,1),(5,4),(5,7)) 

def cube(edges,vertices): 
    glBegin(GL_LINES) 
    for edge in edges: 
     for vertex in edge: 
      glVertex3fv(vertices[vertex]) 
    glEnd() 

def display_cube(): 
    pygame.init() 
    display_window = (800,600) 
    pygame.display.set_mode(display_window,DOUBLEBUF | OPENGL) 
    gluPerspective(45,(display_window[0]/display_window[1]),0.1,50.0) 
    glTranslatef(0.0,0.0,-10) 
    while True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 

     glRotate(1,3,10,10) # (angle,x,y,z) 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 

     cube(edges,vertices1) # large cube 
     cube(edges,vertices) # small cube 

     pygame.display.flip() 
     pygame.time.wait(10) 

display_cube() 

外側のキューブ(より大きなもの)に囲まれた内側のキューブ(小さいもの)を簡単に得ることができました。しかし、両方の頂点に参加することはできません。

...私はあなたの貴重な答えを共有し、事前に

This is the image which I wanted to get

感謝を助けてください。

+1

常にタグを追加する前に、タグの説明をお読みください。例えば、[tag:join]は、データベース結合の場合のみです。 – BDL

答えて

1

3つのVAOを準備できます。 内側キューブの頂点を1番目に含む。 外側キューブの2番目の頂点を含む。 第3に、ペアワイズ頂点のVAOを作成します。例えば、

A B C Dは外側立方体の面の頂点であり、b c dは内側立方体の面の頂点です。今度は、AからA、BからB、CからC、DからDの間に線を描きたいと思います。 VBOを(A、a、B、b、C、c、D、d)として準備します。この後、このVBOを描画するには、GL_LINEプリミティブを使用します。

これは明らかです。

2

両方のリストのグループポイントはzip(vertices1, vertices2)で、描画する行があります。

def lines(vertices1, vertices2): 
    for v1, v2 in zip(vertices1, vertices2): 
     glBegin(GL_LINES) 
     glVertex3fv(v1) 
     glVertex3fv(v2) 
     glEnd() 


lines(vertices, vertices1) 

そして、あなたが得る

enter image description here

全コード

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


vertices = ((1,-1,-1),(1,1,-1),(-1,1,-1),(-1,-1,-1),(1,-1,1),(1,1,1),(-1,-1,1),(-1,1,1)) 
vertices1 = ((2,-2,-2),(2,2,-2),(-2,2,-2),(-2,-2,-2),(2,-2,2),(2,2,2),(-2,-2,2),(-2,2,2)) 

edges = ((0,1),(0,3),(0,4),(2,1),(2,3),(2,7),(6,3),(6,4),(6,7),(5,1),(5,4),(5,7)) 

def cube(edges,vertices): 
    glBegin(GL_LINES) 
    for edge in edges: 
     for vertex in edge: 
      glVertex3fv(vertices[vertex]) 
    glEnd() 

def lines(vertices1, vertices2): 
    for v1, v2 in zip(vertices1, vertices2): 
     glBegin(GL_LINES) 
     glVertex3fv(v1) 
     glVertex3fv(v2) 
     glEnd() 

def display_cube(): 
    pygame.init() 
    display_window = (800,600) 
    pygame.display.set_mode(display_window,DOUBLEBUF | OPENGL) 
    gluPerspective(45,(display_window[0]/display_window[1]),0.1,50.0) 
    glTranslatef(0.0,0.0,-10) 
    while True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 

     glRotate(1,3,10,10) # (angle,x,y,z) 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 

     cube(edges,vertices1) # large cube 
     cube(edges,vertices) # small cube 
     lines(vertices1, vertices) 

     pygame.display.flip() 
     pygame.time.wait(10) 

display_cube() 
関連する問題