Создайте плоскость, которая урезает куб Pyglet - PullRequest
2 голосов
/ 13 марта 2019

У меня есть движущийся, масштабируемый, вращающийся куб, мне нужно создать плоскость, которая будет обрезать куб таким образом enter image description here

Вот код чертежа

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()

1 Ответ

1 голос
/ 13 марта 2019

С Legacy OpenGL с фиксированной функцией конвейера вы можете установить плоскость отсечения.

Может быть более 1 плоскости отсечения, и плоскости должны быть включены с помощью glEnable(GL_CLIP_PLANEi).

Плоскость установлена ​​glClipPlane. Параметры для плоскости отсечения интерпретируются как Уравнение плоскости . Первые 3 компонента уравнения плоскости представляют собой вектор нормали к плоскости отсечения. 4-й компонент - это расстояние до начала координат:

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

Подробную спецификацию см. Спецификация профиля совместимости API OpenGL 4.6 - 13.7. ПРЕИМУЩЕСТВЕННОЕ ОБОРУДОВАНИЕ ; страница 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()

...