Попытка создать куб 3x3x3, но вместо этого создать в OpenGL 4x4x4 - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь создать 3d кубик Рубика, однако размеры не совпадают с установленными размерами.Когда я устанавливаю размеры 3 и создаю куб 3x3x3, я получаю куб 4x4x4.Однако, когда я устанавливаю размерность 2, он создает куб 3x3x3, а когда размерность устанавливается равным 1, создается куб 1x1x1.Может ли кто-нибудь помочь с этим?Спасибо!

Код для куба:

#imports
dim = 3
cube = [[['#' for c in range(dim)] for c in range(dim)] for r in range(dim)]

for i in range(dim):
    for j in range(dim):
        for k in range(dim):
            print(cube[i][j][k], end='')
        print()
    print()

for i in range(dim):
    for j in range(dim):
        for k in range(dim):
            scale = 0.5
            cube[i][j][k] = Piece(i * scale, j * scale, k * scale, scale)

def Cube():
    for i in range(dim):
        for j in range(dim):
            for k in range(dim):
                p = cube[i][j][k]
                p.draw()


def main():
    pygame.init()
    display = (1200, 1000)
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

    gluPerspective(45, (display[0] / display[1]), 0.1, 50)

    glClearColor(0.6, 0.6, 0.6, 0)
    glTranslatef(0.0, 0.0, -5)
    glRotatef(45, 1, 1, 0)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        Cube()
        pygame.display.flip()
        pygame.time.wait(10)


main()

Код для фигуры:

from OpenGL.GL import *

colors = (
    # white
    (1, 1, 1),
    # blue
    (1, 1, 0),
    # orange
    (1, 0, 0),
    # red
    (1, 0.5, 0.1),
    # green
    (0, 1, 0),
    # yellow
    (0, 0, 1),
)

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


class Piece:

    def __init__(self, x, y, z, length):
        self.x = x
        self.y = y
        self.z = z
        self.len = length

        self.v = [
            (self.x - self.len, self.y - self.len, self.z - self.len),
            (self.x + self.len, self.y - self.len, self.z - self.len),
            (self.x + self.len, self.y + self.len, self.z - self.len),
            (self.x - self.len, self.y + self.len, self.z - self.len),
            (self.x - self.len, self.y - self.len, self.z + self.len),
            (self.x + self.len, self.y - self.len, self.z + self.len),
            (self.x + self.len, self.y + self.len, self.z + self.len),
            (self.x - self.len, self.y + self.len, self.z + self.len),
        ]


    def getVertices(self):
        return self.x, self.y, self.z

    def draw(self):
        glEnable(GL_DEPTH_TEST)

        glLineWidth(5)
        glColor3fv((0, 0, 0))
        glBegin(GL_LINES)
        for edge in edges:
            glVertex3fv(self.v[edge[0]])
            glVertex3fv(self.v[edge[1]])
        glEnd()

        glEnable(GL_POLYGON_OFFSET_FILL)
        glPolygonOffset(1.0, 1.0)

        glBegin(GL_QUADS)
        for i, quad in enumerate(surfaces):
            glColor3fv(colors[i])
            for iv in quad:
                glVertex3fv(self.v[iv])
        glEnd()

        glDisable(GL_POLYGON_OFFSET_FILL)

1 Ответ

3 голосов
/ 18 июня 2019

Это может выглядеть так, потому что ваши фигуры перекрываются.

Вы создаете свои фигуры на расстоянии scale.Если мы визуализируем это в 1D, мы получим (s означает scale):

          o         o         o  
           `-- s --´ `-- s --´ 

Части простираются от pos - len до pos + len.Вы установили len = scale.Следовательно, вы получите:

           ---------o--------- 
 ---------o--------- ---------o----------    
           `-- s --´ `-- s --´ 

Чтобы решить эту проблему, вы должны указать длину, равную половине интервала.Итак, либо:

cube[i][j][k] = Piece(2 * i * scale, 2 * j * scale, 2 * k * scale, scale)

, либо

cube[i][j][k] = Piece(i * scale, j * scale, k * scale, 0.5 * scale)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...