Как сделать куб в пиглете с изображениями на лицах - PullRequest
1 голос
/ 04 июля 2019

Я делаю 3d-игру, и мне нужно вставить изображения на куб, но я не могу найти, где front / back / top / bottom / left / right текстуры должны идти.

Я только начал использовать pyglet, поэтому я не очень знаком с ним. Я переворачиваю текстурную часть куба уже несколько дней, и это все еще беспорядок. Вот мой код для функции куба ниже:

def cuboid(self, x1,y1,z1, x2,y2,z2, tex):
    '''
    Draws a cuboid from x1,y1,z1 to x2,y2,z2 and covers each side with tex\n
    tex format:\n
        (front, back, left, right, top, bottom)
    Facing in the -z direction
    '''
    front = tex[0]
    back = tex[1]
    left = tex[2]
    right = tex[3]
    top = tex[4]
    bottom = tex[5]

    tex_coords = ("t2f", (0,0, 1,0, 1,1, 0,1))

    self.batch.add(4,GL_QUADS,back,('v3f',(x1,y1,z1, x1,y1,z2, x1,y2,z2, x1,y2,z1, )),tex_coords)
    self.batch.add(4,GL_QUADS,right,('v3f',(x2,y1,z2, x2,y1,z1, x2,y2,z1, x2,y2,z2, )),tex_coords)
    self.batch.add(4,GL_QUADS,top,('v3f',(x1,y1,z1, x2,y1,z1, x2,y1,z2, x1,y1,z2, )),tex_coords)
    self.batch.add(4,GL_QUADS,front,('v3f',(x1,y2,z2, x2,y2,z2, x2,y2,z1, x1,y2,z1, )),tex_coords)
    self.batch.add(4,GL_QUADS,bottom,('v3f',(x2,y1,z1, x1,y1,z1, x1,y2,z1, x2,y2,z1, )),tex_coords)
    self.batch.add(4,GL_QUADS,left,('v3f',(x1,y1,z2, x2,y1,z2, x2,y2,z2, x1,y2,z2, )),tex_coords)

Я не могу показать то, что ожидал, потому что у меня нет работающей программы 3D-рендеринга.

1 Ответ

1 голос
/ 04 июля 2019

Я предполагаю, что координаты (x1, y1, z1) - это минимум куба, а координаты - максимум (x1, y1, z1). e.g.:

self.cuboid(0, 0, 0, 1, 1, 1, self.tex)

Если куб нарисован в пространстве вида, то:

Ось X указывает налево. Текстура left должна быть размещена там, где координаты x всех вершин x1, и текстура right, где координаты x x2:

self.batch.add(4, GL_QUADS, right,  ('v3f',(x1,y1,z1, x1,y1,z2, x1,y2,z2, x1,y2,z1)), tex_coords)
self.batch.add(4, GL_QUADS, left,   ('v3f',(x2,y1,z2, x2,y1,z1, x2,y2,z1, x2,y2,z2)), tex_coords)

Ось Y направлена ​​вверх. Таким образом, bottom - это где координаты y равны y1, а верхняя часть - там, где координаты y равны y2:

self.batch.add(4, GL_QUADS, bottom, ('v3f',(x1,y1,z1, x2,y1,z1, x2,y1,z2, x1,y1,z2)), tex_coords)
self.batch.add(4, GL_QUADS, top,    ('v3f',(x1,y2,z2, x2,y2,z2, x2,y2,z1, x1,y2,z1)), tex_coords)

В Правосторонней системе ось z указывает за пределы вида. Ось z - это Перекрестное произведение от оси X и оси Y.
Это приводит к тому, что front необходимо размещать там, где координаты z равны z2, и back, где координаты z равны z1:

.
self.batch.add(4, GL_QUADS, back,   ('v3f',(x2,y1,z1, x1,y1,z1, x1,y2,z1, x2,y2,z1)), tex_coords)
self.batch.add(4, GL_QUADS, front,  ('v3f',(x1,y1,z2, x2,y1,z2, x2,y2,z2, x1,y2,z2)), tex_coords)

Метод cuboid:

def cuboid(self, x1,y1,z1, x2,y2,z2, tex):
    '''
    Draws a cuboid from x1,y1,z1 to x2,y2,z2 and covers each side with tex\n
    tex format:\n
        (front, back, left, right, top, bottom)
    Facing in the -z direction
    '''
    front  = tex[0]
    back   = tex[1]
    left   = tex[2]
    right  = tex[3]
    top    = tex[4]
    bottom = tex[5]

    tex_coords = ("t2f", (0,0, 1,0, 1,1, 0,1))

    self.batch.add(4, GL_QUADS, right,  ('v3f',(x1,y1,z1, x1,y1,z2, x1,y2,z2, x1,y2,z1)), tex_coords)
    self.batch.add(4, GL_QUADS, left,   ('v3f',(x2,y1,z2, x2,y1,z1, x2,y2,z1, x2,y2,z2)), tex_coords)
    self.batch.add(4, GL_QUADS, bottom, ('v3f',(x1,y1,z1, x2,y1,z1, x2,y1,z2, x1,y1,z2)), tex_coords)
    self.batch.add(4, GL_QUADS, top,    ('v3f',(x1,y2,z2, x2,y2,z2, x2,y2,z1, x1,y2,z1)), tex_coords)
    self.batch.add(4, GL_QUADS, back,   ('v3f',(x2,y1,z1, x1,y1,z1, x1,y2,z1, x2,y2,z1)), tex_coords)
    self.batch.add(4, GL_QUADS, front,  ('v3f',(x1,y1,z2, x2,y1,z2, x2,y2,z2, x1,y2,z2)), tex_coords)
...