Почему камера в проекте с использованием PyOpenGL и Pygame отдаляется от куба?

Как можно улучшить мой код, чтобы он корректно отображал куб с гранями и цветами? Мой текущий код выглядит следующим образом: <br/> <pre><code>import time

import pygame
from math import *
from pygame.locals import *
import glm
from OpenGL.GL import *
from OpenGL.GLU import *
import pyautogui

verticies = (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
)
edges = (
    (0, 1),
    (0, 3),
    (0, 4),
    (2, 1),
    (2, 3),
    (2, 7),
    (6, 3),
    (6, 4),
    (6, 7),
    (5, 1),
    (5, 4),
    (5, 7)
)
faces = [
    (0, 1, 2, 3),
    (3, 2, 6, 7),
    (7, 6, 5, 4),
    (4, 5, 1, 0),
    (1, 5, 6, 2),
    (4, 0, 3, 7),
]

colors = [
    (1, 0, 0),  # Красный
    (0, 1, 0),  # Зеленый
    (0, 0, 1),  # Синий
    (1, 1, 0),  # Желтый
    (1, 0, 1),  # Магента
    (0, 1, 1),  # Циан
]


def Cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(verticies[vertex])
    glEnd()
    #glBegin(GL_QUADS)
    #for i, face in enumerate(faces):
    #    glColor3fv(colors[i])  # Установка цвета для каждой грани
    #    for vertex in face:
    #        glVertex3fv(vertices[vertex])  # Установка вершины
    #glEnd()
#
    #glBegin(GL_LINES)
    #for edge in edges:
    #    for vertex in edge:
    #        glVertex3fv(vertices[vertex])  # Отрисовка ребер
#
    #glEnd()


def main():
    pygame.init()
    display = (0, 0)
    screen = pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
    y_r = -90.0
    x_r = 0.0
    console = pygame.font.SysFont('system', 8)
    out = ""
    gluPerspective(60, (16 / 9), 0.9, 50.0)
    player_coord1 = [0.0, 0.0, 5.0]
    glTranslate(0, 0, -5)
    player_direct = [0.0, 0.0, -1.0]
    up = [0.0, 1.0, 0.0]

    while Tru
  • 11 января 2025 г. 18:34
Ответы на вопрос 1
Ваш код на Python с использованием PyOpenGL и Pygame содержит несколько аспектов, которые могут привести к тому, что камера "отдаляется" от куба. Основные проблемы и предложения по улучшению:

1. **Координаты камеры**: В вашем коде вы используете `glTranslate(0, 0, -5)` для перемещения камеры. Это нормально, но нужно убедиться, что вы не перемещаете сам куб или не изменяете его позицию. Если вы хотите, чтобы куб оставался в центре экрана, используйте правильные координаты для трансляции.

2. **Отрисовка границ и граней**: Код для отрисовки граней куба закомментирован. Вам необходимо раскомментировать этот код, чтобы увидеть цветные грани куба.

3. **Обновление экрана**: В вашем основном цикле, кажется, не хватает секции для обработки событий и отрисовки. Например, необходимо добавлять `pygame.display.flip()` для обновления экрана после отрисовки каждого кадра.

4. **Проблемы с углами**: Вы не настраиваете матрицы моделей и проекции должным образом, что может привести к искажению визуализации.

Вот улучшенный пример вашего кода:

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

# Вершины и грани куба
vertices = (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
)

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

faces = [
    (0, 1, 2, 3),
    (3, 2, 6, 7),
    (7, 6, 5, 4),
    (4, 5, 1, 0),
    (1, 5, 6, 2),
    (4, 0, 3, 7),
]

colors = [
    (1, 0, 0),  # Красный
    (0, 1, 0),  # Зеленый
    (0, 0, 1),  # Синий
    (1, 1, 0),  # Желтый
    (1, 0, 1),  # Магента
    (0, 1, 1),  # Циан
]

def Cube():
    # Отрисовка граней куба
    glBegin(GL_QUADS)
    for i, face in enumerate(faces):
        glColor3fv(colors[i])
        for vertex in face:
            glVertex3fv(vertices[vertex])
    glEnd()

    # Отрисовка ребер куба
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

def main():
    pygame.init()
    display = (800, 600)  # Размеры окна
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
    gluPerspective(60, (display[0] / display[1]), 0.1, 50.0)
    glTranslatef(0.0, 0.0, -5)  # Перемещение камеры

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return

        glRotatef(1, 0, 1, 0)  # Вращение куба
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        Cube()
        pygame.display.flip()
        pygame.time.wait(10)

main()
```

Основные изменения:

- Размер окна задан как `(800, 600)`.
- Перемещение камеры выполнено корректно.
- Куб теперь отображает как грани, так и ребра.
- Установлено вращение куба для динамичной отрисовки.

Помните также проверять шейдеры и настройки OpenGL,
Похожие вопросы