【问题标题】:How do I render a matrix as a cube in OpenGL?如何在 OpenGL 中将矩阵渲染为立方体?
【发布时间】:2020-04-05 03:14:31
【问题描述】:

我正在尝试使用 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()

【问题讨论】:

    标签: python opengl graphics 3d


    【解决方案1】:

    您只需渲染以(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 调用进行硬编码......

    【讨论】:

      【解决方案2】:

      魔方可以由 3x3x3 立方体的 3 维数组组织。旋转立方体的切片似乎很容易,但请注意,如果切片旋转,立方体的位置会发生变化并且必须重新组织。不仅位置发生变化,(旋转的)单个立方体的方向也发生变化。

      看看这个 rabbid 的回答, https://stackoverflow.com/a/54953213/7977581

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

      【讨论】:

      • 这只是链接的答案,所以它应该是一个评论。无论如何,米色应该知道链接的 QA 以及另一个(我的)Quaternion rotation do not works as excepted,因为我们在他的previous question 中评论了他(我和 Rabbid76)。无论如何,这个问题不是关于旋转,而是立方体在旧式 api 中呈现本身......链接的答案包含但它在一个更复杂的代码中,对于那些不知道他们在做什么的人来说很难提取。跨度>
      猜你喜欢
      • 2018-09-27
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多