如何在OpenGL中将矩阵渲染为立方体?

时间:2019-06-22 05:35:55

标签: python opengl graphics 3d

我正在尝试使用openGL创建一个rubiks多维数据集。在每块代码中,我想使用矩阵围绕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 :(得分:0)

您只需渲染以(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个cal进行硬编码而无需循环...。

答案 1 :(得分:0)

魔方可以通过3x3x3多维数据集的3维数组来组织。旋转多维数据集的一个切片似乎很容易,但是请注意,如果在切片上旋转了,则多维数据集的位置会发生变化,必须重新组织。不仅位置发生变化,(旋转的)单个立方体的方向也发生变化。

通过rabbid查看此答案, https://stackoverflow.com/a/54953213/7977581

非常具有描述性。他还用Python进行了解释。