【问题标题】:Create a plane that trims cube Pyglet创建一个修剪立方体 Pyglet 的平面
【发布时间】:2019-08-04 10:47:03
【问题描述】:

我有一个移动、缩放、旋转的立方体,我需要创建一个平面来修剪立方体

这里是绘图代码

pgl.glLoadIdentity()
pgl.glViewport(650, 500, 650, 500)
pgl.glMatrixMode(ogl.GL_PROJECTION)
pgl.glLoadIdentity()

pgl.gluPerspective(self.dist, 1.3, 1, 1000)

pgl.glMatrixMode(ogl.GL_MODELVIEW)

pgl.glTranslatef(0, 0, -400)

pgl.glPushMatrix()
pgl.glTranslatef(self.x, self.y, self.z)
pgl.glRotatef(self.xRotation, 1, 0, 0)
pgl.glRotatef(self.yRotation, 0, 1, 0)
pgl.glRotatef(self.zRotation, 0, 0, 1)
pgl.glScalef(self.zoom, self.zoom, self.zoom)


if not transparant:
    pgl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_FILL)
else:
    pgl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_LINE)

draw_big()

pgl.glPopMatrix()

【问题讨论】:

  • 你想剪下立方体,这样你就可以看到立方体内部,还是想在封闭网格的边缘上放一个三角形?
  • 我想看看里面,我尝试使用glOrtho,但我不知道如何将它放在屏幕前面,而不是例如左侧

标签: python opengl pyglet clipping opengl-compat


【解决方案1】:

使用Legacy OpenGL 固定功能管道,您可以设置剪切平面。

可以有多个剪辑平面,并且这些平面必须由glEnable(GL_CLIP_PLANEi) 启用。

飞机由glClipPlane设置。剪裁平面的参数被解释为Plane Equation。 平面方程的前 3 个分量是剪切平面的法向量。第 4 个分量是到原点的距离:

plane = plane = [-1.0, -1.0, -1.0, -280]
ogl.glClipPlane(pgl.GL_CLIP_PLANE0, plane)

详细规格见OpenGL 4.6 API Compatibility Profile Specification - 13.7. PRIMITIVE CLIPPING;第 537 页。
请注意,当前模型视图矩阵的逆矩阵在指定时应用于裁剪平面系数。

看例子,根据问题的代码:

def on_draw(self) :

    self.clear()
    pgl.glClear(pgl.GL_COLOR_BUFFER_BIT | pgl.GL_DEPTH_BUFFER_BIT)

    pgl.glViewport(0, 0, 500, 500)

    pgl.glMatrixMode(ogl.GL_PROJECTION)
    pgl.glLoadIdentity()
    pgl.gluPerspective(45, 1, 1, 1000)

    pgl.glMatrixMode(ogl.GL_MODELVIEW)
    pgl.glLoadIdentity()
    pgl.glTranslatef(0, 0, -400)

    pgl.glPushMatrix()
    pgl.glTranslatef(self.x, self.y, self.z)
    pgl.glRotatef(self.xRotation, 1, 0, 0)
    pgl.glRotatef(self.yRotation, 0, 1, 0)
    pgl.glRotatef(self.zRotation, 0, 0, 1)
    pgl.glScalef(self.zoom, self.zoom, self.zoom)

    if not transparant:
        pgl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_FILL)
    else:
        pgl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_LINE)

    # set and enable clip plane
    plane = plane = [-1.0, -1.0, -1.0, -280]
    ogl.glEnable(pgl.GL_CLIP_PLANE0)
    ogl.glClipPlane(pgl.GL_CLIP_PLANE0, plane)

    draw_big()
    ogl.glDisable(pgl.GL_CLIP_PLANE0)

    pgl.glPopMatrix()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多