Почему в OpenGL на Python получаю треугольник вместо икосаэдра?
Пытаюсь получить икосаэдр. Причем через вершины, а не определение индексов. Однако на выходе имею треугольник вместо полноценного икосаэдра. Что делаю не так?
Код
import glfw
from OpenGL.GL import *
import numpy as np
from math import sqrt
# 1. инициализация библиотеки glfw
if not glfw.init():
raise Exception('Бибиотека glfw не может быть инициализирована')
# 2. создаем окно
window = glfw.create_window(1280, 720, 'Моя программа', None, None)
# 3. проверим, правильно ли окно было создано
if not window:
glfw.terminate()
raise Exception('Окно glfw не может быть создано')
# 4. установим положение окна
glfw.set_window_pos(window, 400, 200)
# 5. установим функцию обратного вызова для изменения размера окна;
glfw.set_window_size_callback(window, window_resize)
# 6. функция изменения размера окна
def window_resize(window, width, height):
glViewport(0, 0, width, height)
# 7. сделаем контекст текущим (передадим фунции переменную window)
glfw.make_context_current(window)
scale = 1
# 8. Возвращаем координаты вершин икосаэндра
def vertex(x, y, z):
length = sqrt(x**2 + y**2 + z**2)
return [(i * scale) / length for i in (x,y,z)]
# 9.Создаем икосаэдр
# Золотое сечение
PHI = (1 + sqrt(5)) / 2
# 9.1. вершины
vertices = [
vertex(-1, PHI, 0),
vertex( 1, PHI, 0),
vertex(-1, -PHI, 0),
vertex( 1, -PHI, 0),
vertex(0, -1, PHI),
vertex(0, 1, PHI),
vertex(0, -1, -PHI),
vertex(0, 1, -PHI),
vertex( PHI, 0, -1),
vertex( PHI, 0, 1),
vertex(-PHI, 0, -1),
vertex(-PHI, 0, 1)
]
# 9.2. цвета вершин
colors = [ 1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0,
0.0, 1.0, 0.0,
0.0, 1.0, 0.0,
1.0, 0.0, 0.0,
0.0, 0.0, 1.0,
0.0, 0.0, 1.0,
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0,
1.0, 0.0, 0.0 ]
# 10. преобразуем списки Python в массивы numpy
vertices = np.array(vertices, dtype=np.float32)
colors = np.array(colors, dtype=np.float32)
# 11. "включим" массивы вершин и цветов вершин
glEnableClientState(GL_VERTEX_ARRAY)
glVertexPointer(3, GL_FLOAT, 0, vertices)
glEnableClientState(GL_COLOR_ARRAY)
glColorPointer(3, GL_FLOAT, 0, colors)
# 12. определим цвет фона
glClearColor(0, 0.1, 0.1, 1)
# 13. создадим основной цикл приложения
while not glfw.window_should_close(window):
# обеспечим ответ на курсор мышки
glfw.poll_events()
# функция, которая позволит увидеть эффект настройки цветов в строке glClearColor(0, 0.1, 0.1, 1)
glClear(GL_COLOR_BUFFER_BIT)
# заменим текущую матрицу на идентификационную матрицу
glLoadIdentity()
# определим примитив для отображения.
glDrawArrays(GL_TRIANGLES, 0, 3)
# здесь используется двойная буферизация кадров (задний отрисоывает, передний - показывает)
glfw.swap_buffers(window)
# 14. закроем glfw, освободим выделенные ресурсы памяти
glfw.terminate()
Источник: Stack Overflow на русском