Как отобразить матрицу как куб в OpenGL? - PullRequest
2 голосов
/ 22 июня 2019

Я пытаюсь создать кубик Рубика с помощью openGL.В коде для каждого отдельного фрагмента я хочу нарисовать куб вокруг x, y, z, используя матрицу.Мне интересно, как мне нарисовать мой куб, как только я обработал его с помощью glMultMatrix?Спасибо!

class Piece:

    def __init__(self, x, y, z, position):
        self.x = x
        self.y = y
        self.z = z
        self.matrix = position

    def draw(self, axis, slice, dir):

        glPushMatrix()

        glMultMatrixf(self.matrix)

        glBegin(GL_QUADS)

        #
        # What would go here to draw a cube based off of self.matrix?
        # 

        glEnd()

        glPopMatrix()

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Кубик Рубика может быть организован в виде трехмерного массива кубов 3х3х3.Кажется, что легко повернуть срез куба, но обратите внимание, что при вращении среза положения куба меняются и должны быть реорганизованы.Меняется не только положение, но и ориентация (повернутых) отдельных кубиков.

Проверьте этот ответ по равнодушному, https://stackoverflow.com/a/54953213/7977581

Это очень наглядно.Также он объясняет это на Python.

0 голосов
/ 22 июня 2019

Вы просто визуализируете выровненный по оси куб с центром в (0,0,0), поэтому набор 4*6=24 glVertex вызовов с комбинациями +/-1.0 или любого другого размера.Вы можете извлечь вершины из этого примера (в более новых API)

, поэтому кодбыло бы (C ++):

const GLfloat vao_pos[]=
    {
//  x    y    z     //ix
    -1.0,+1.0,-1.0, //0
    +1.0,+1.0,-1.0, //1
    +1.0,-1.0,-1.0, //2
    -1.0,-1.0,-1.0, //3

    -1.0,-1.0,+1.0, //4
    +1.0,-1.0,+1.0, //5
    +1.0,+1.0,+1.0, //6
    -1.0,+1.0,+1.0, //7
    };

const GLuint vao_ix[]=
    {
    0,1,2,3,
    4,5,6,7,
    3,2,5,4,
    2,1,6,5,
    1,0,7,6,
    0,3,4,7,
    };

glBegin(GL_QUADS);
for (int i=0;i<24;i++) glVertex3dv(vao_pos+3*vao_ix[i]);
glEnd();

или это:

const GLfloat vao_pos[]=
    {
//  x    y    z     //ix
    -1.0,+1.0,-1.0, //0
    +1.0,+1.0,-1.0, //1
    +1.0,-1.0,-1.0, //2
    -1.0,-1.0,-1.0, //3

    -1.0,-1.0,+1.0, //4
    +1.0,-1.0,+1.0, //5
    +1.0,+1.0,+1.0, //6
    -1.0,+1.0,+1.0, //7

    -1.0,-1.0,-1.0, //3
    +1.0,-1.0,-1.0, //2
    +1.0,-1.0,+1.0, //5
    -1.0,-1.0,+1.0, //4

    +1.0,-1.0,-1.0, //2
    +1.0,+1.0,-1.0, //1
    +1.0,+1.0,+1.0, //6
    +1.0,-1.0,+1.0, //5

    +1.0,+1.0,-1.0, //1
    -1.0,+1.0,-1.0, //0
    -1.0,+1.0,+1.0, //7
    +1.0,+1.0,+1.0, //6

    -1.0,+1.0,-1.0, //0
    -1.0,-1.0,-1.0, //3
    -1.0,-1.0,+1.0, //4
    -1.0,+1.0,+1.0, //7
    };

glBegin(GL_QUADS);
for (int i=0;i<24*3;i+=3) glVertex3dv(vao_pos+i);
glEnd();

, поэтому просто перенесите его на python (я не пишу код на python), это действительно просто массив и цикл... Вы также можете жестко закодировать 24 glVertex CALS без цикла ....

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