Ваш код на 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,