Перемещение только одного куба из 2 в Python с PyOpenGL

Итак, я новичок в PyOpenGL и хочу создать простую 3D-игру.

Я создал куб большего размера (он должен представлять игрока) и куб меньшего размера (он должен представлять врага). Мне нужно, чтобы игрок мог двигаться влево и вправо, а враги приходили спереди. Проблема в том, что они находятся в одинаковом положении.

Я использую glTranslatef(x, y, z) для перемещения игрока, но враг перемещается в ту же позицию, что и игрок.

Вот мой код:

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import*


class display:
    def __init__(self, width, height, window):
        self.width = width
        self.height = height
        self.window = window

    def update(self):
        pygame.display.flip()
        pygame.time.wait(10)

    def clear(self):
        glClearColor(0.15, 0.15, 0.15, 1)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)


display = display(800, 600, pygame.display.set_mode((800, 600), DOUBLEBUF|OPENGL))


class player:
    def __init__(self, vertices, edges):
        self.vertices = vertices
        self.edges = edges

    def begin(self):
        glTranslatef(0.0, -5.0, -12.0)
        glRotatef(20, 1, 0.0, 0.0)

    def move(self):
        self.k_press = pygame.key.get_pressed()
        if self.k_press[pygame.K_LEFT]:
            glTranslatef(-0.2, 0, 0)
        if self.k_press[pygame.K_RIGHT]:
            glTranslatef(0.2, 0, 0)

    def draw(self):
        glBegin(GL_LINES)
        for edge in player.edges:
            for vertex in edge:
                glVertex3fv(player.vertices[vertex])
        glEnd()


player = player(
    ((1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, -1), (1, -1, 1), (1, 1, 1), (-1, -1, 1), (-1, 1, 1)),
    ((0, 1), (0, 3), (0, 4), (2, 1), (2, 3), (2, 7), (6, 3), (6, 4), (6, 7), (5, 1), (5, 4), (5, 7))
)


class enemy:
    def __init__(self, vertices, edges):
        self.vertices = vertices
        self.edges = edges

    def draw(self):
        glBegin(GL_LINES)
        for edge in enemy.edges:
            for vertex in edge:
                glVertex3fv(enemy.vertices[vertex])
        glEnd()


enemy = enemy(
    ((0.5, -0.5, -0.5), (0.5, 0.5, -0.5), (-0.5, 0.5, -0.5), (-0.5, -0.5, -0.5), (0.5, -0.5, 0.5), (0.5, 0.5, 0.5), (-0.5, -0.5, 0.5), (-0.5, 0.5, 0.5)),
    ((0, 1), (0, 3), (0, 4), (2, 1), (2, 3), (2, 7), (6, 3), (6, 4), (6, 7), (5, 1), (5, 4), (5, 7))
)


gluPerspective(70, (display.width/display.height), 0.1, 50.0)

player.begin()

game_over = False
while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True

    display.clear()

    player.move()
    player.draw()
    enemy.draw()

    display.update()

pygame.quit()

На данный момент я просто хочу, чтобы противник и игрок двигались, не находясь в одной позиции. В любом случае, спасибо за помощь!


person Yenz1    schedule 28.03.2020    source источник


Ответы (1)


Прежде всего используйте glMatrixMode, чтобы различать матрица проекции и матрица модели. Матрица проекции должна быть установлена ​​на текущую матрицу проекции, а матрица вида - на матрицу вида текущей модели.

# set projection matrix
glMatrixMode(GL_PROJECTION)
gluPerspective(70, (display.width/display.height), 0.1, 50.0)

# set view matrix
glMatrixMode(GL_MODELVIEW)
glTranslatef(0.0, -5.0, -12.0)
glRotatef(20, 1, 0.0, 0.0)

game_over = False
while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True

    display.clear()

    player.move()
    player.draw()
    enemy.draw()

    display.update()

Эта настройка позволит позже изменить точку зрения.

Индивидуальное движение, анимация и положение каждого объекта в сцене могут быть достигнуты с помощью матрицы модели для каждого объекта. Сохраните текущую матрицу вида модели до рисования объекта и восстановите матрицу после рисования объекта с помощью _ 3 _ / _ 4_.
Это позволяет установить индивидуальную позицию для каждого объекта. Сохраните текущую позицию объекта в атрибуте (self.pos = [0, 0, 0]). манипулировать позицией в move (например, self.pos[0] -= 0.2) и умножать матрицу трансляции модели на текущую матрицу вида модели перед отрисовкой объекта (glTranslatef(*self.pos)). например:

class player:
    def __init__(self, vertices, edges):
        self.vertices = vertices
        self.edges = edges
        self.pos = [0, 0, 0]

    def move(self):
        self.k_press = pygame.key.get_pressed()
        if self.k_press[pygame.K_LEFT]:
            self.pos[0] -= 0.2
        if self.k_press[pygame.K_RIGHT]:
            self.pos[0] += 0.2

    def draw(self):
        glPushMatrix()
        glTranslatef(*self.pos)
        glBegin(GL_LINES)
        for edge in player.edges:
            for vertex in edge:
                glVertex3fv(player.vertices[vertex])
        glEnd()
        glPopMatrix()
class enemy:
    def __init__(self, vertices, edges):
        self.vertices = vertices
        self.edges = edges
        self.pos = [0, 0, 0]

    def draw(self):
        glPushMatrix()
        glTranslatef(*self.pos)
        glBegin(GL_LINES)
        for edge in enemy.edges:
            for vertex in edge:
                glVertex3fv(enemy.vertices[vertex])
        glEnd()
        glPopMatrix()
person Rabbid76    schedule 28.03.2020
comment
Спасибо, парень, извини, что побеспокоил тебя, но я только начал с этого и мало знаю об этом. Еще раз спасибо! - person Yenz1; 28.03.2020