Почему в OpenGL на Python получаю треугольник вместо икосаэдра?

Рейтинг: 1Ответов: 0Опубликовано: 09.04.2023

Пытаюсь получить икосаэдр. Причем через вершины, а не определение индексов. Однако на выходе имею треугольник вместо полноценного икосаэдра. Что делаю не так?

Код

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

Ответы

Ответов пока нет.