Anonymous
Проблемы с изометрической проекцией в Python
Сообщение
Anonymous » 04 янв 2024, 21:57
Я пытаюсь создать форму II из формы I и создал следующий код.
импортировать pygame из импорта pygame.locals * из импорта OpenGL.GL * из импорта OpenGL.GLU * импортировать numpy как np вершины = np.array([ [0, 0, 0, 1], [0,707, -0,408, 0, 1], [0, -0,816, 0, 1], [-0,707, -0,408, 0, 1], [-0,707, 0,408, 0, 1], [0, 0,816, 0, 1], [0,707, 0,408, 0, 1], [0, 0, 0, 1] ], dtype=np.float64) края = [ (0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (3, 0), (4, 7), (7, 2), (6, 1), (0, 5) ] axis_vertices = np.array([ [0, 0, 0, 1], [4, 0, 0, 1], [0, 4, 0, 1], [0, 0, 4, 1] ], dtype=np.float64) axis_edges = [ (0, 1), (0, 2), (0, 3) ] Защиту Multiple_matrix_vector(матрица, вектор): результат = np.zeros(matrix.shape[0]) для меня в диапазоне (matrix.shape[0]): temp_result = np.dot(матрица[i,:], вектор) список (результат)
= temp_result вернуть результат защита draw_cube(): глБегин (GL_LINES) glColor3f(1, 1, 1) для края в краях: для вершины в ребре: glVertex3fv(вершины[вершина][:3]) глКонец() защита draw_axes(): глБегин (GL_LINES) glColor3f(1, 0, 0) glVertex3fv(axis_vertices[0][:3]) glVertex3fv(axis_vertices[1][:3]) glColor3f(0, 1, 0) glVertex3fv(axis_vertices[0][:3]) glVertex3fv(axis_vertices[2][:3]) glColor3f(0, 0, 1) glVertex3fv(axis_vertices[0][:3]) glVertex3fv(axis_vertices[3][:3]) глКонец() def set_perspective_matrix(fov, аспект, ближний, дальний): f = 1,0 / np.tan(np.radians(fov) / 2,0) перспективная_матрица = np.array([ [ф/аспект, 0, 0, 0], [0, ж, 0, 0], [0, 0, (далеко + близко) / (близко - далеко), (2 * далеко * близко) / (близко - далеко)], [0, 0, -1, 0] ]) glLoadMatrixd(perspective_matrix.transpose()) защита основной(): pygame.init() дисплей = (800, 600) pygame.display.set_mode(display, DOUBLEBUF | OPENGL) set_perspective_matrix(45, (display[0] / display[1]), 0.1, 50.0) glTranslatef(0.0, 0.0, -5) draw_cube() pygame.display.flip() пока правда: для события в pygame.event.get(): если event.type == pygame.QUIT: pygame.quit() покидать() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) глПушМатрикс() # Переносим по оси X Translation_matrix = np.array([ [1, 0, 0, 1,5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]) глобальные вершины вершины = np.dot(вершины, Translation_matrix.T) # Выполняем изометрическую проекцию isometric_matrix = np.array([ [0,707, -0,408, 0,577, 0], [0, 0,816, 0,577, 0], [-0,707, -0,408, 0,577, 0], [0, 0, 0, 1] ]) вершины = Multiple_matrix_vector(isometric_matrix, vertices.T).T draw_axes() глПопМатрикс() draw_cube() pygame.display.flip() pygame.time.wait(10) если __name__ == "__main__": основной() Однако при внесении изменений возникла ошибка:
Строка 49
result = temp_result ~~~~~~^^^ ValueError: установка элемента массива с помощью последовательности. Когда я делаю следующую модификацию:
список(результат) = temp_result
Я получаю новую ошибку: строка 64,
glVertex3fv(вершины[вершина][:3]) IndexError: неверный индекс скалярной переменной.
Не могли бы вы мне помочь?
1704394622
Anonymous
[img]https://i.stack.imgur.com/SzDUX.png[/img] Я пытаюсь создать форму II из формы I и создал следующий код. импортировать pygame из импорта pygame.locals * из импорта OpenGL.GL * из импорта OpenGL.GLU * импортировать numpy как np вершины = np.array([ [0, 0, 0, 1], [0,707, -0,408, 0, 1], [0, -0,816, 0, 1], [-0,707, -0,408, 0, 1], [-0,707, 0,408, 0, 1], [0, 0,816, 0, 1], [0,707, 0,408, 0, 1], [0, 0, 0, 1] ], dtype=np.float64) края = [ (0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (3, 0), (4, 7), (7, 2), (6, 1), (0, 5) ] axis_vertices = np.array([ [0, 0, 0, 1], [4, 0, 0, 1], [0, 4, 0, 1], [0, 0, 4, 1] ], dtype=np.float64) axis_edges = [ (0, 1), (0, 2), (0, 3) ] Защиту Multiple_matrix_vector(матрица, вектор): результат = np.zeros(matrix.shape[0]) для меня в диапазоне (matrix.shape[0]): temp_result = np.dot(матрица[i,:], вектор) список (результат) [i] = temp_result вернуть результат защита draw_cube(): глБегин (GL_LINES) glColor3f(1, 1, 1) для края в краях: для вершины в ребре: glVertex3fv(вершины[вершина][:3]) глКонец() защита draw_axes(): глБегин (GL_LINES) glColor3f(1, 0, 0) glVertex3fv(axis_vertices[0][:3]) glVertex3fv(axis_vertices[1][:3]) glColor3f(0, 1, 0) glVertex3fv(axis_vertices[0][:3]) glVertex3fv(axis_vertices[2][:3]) glColor3f(0, 0, 1) glVertex3fv(axis_vertices[0][:3]) glVertex3fv(axis_vertices[3][:3]) глКонец() def set_perspective_matrix(fov, аспект, ближний, дальний): f = 1,0 / np.tan(np.radians(fov) / 2,0) перспективная_матрица = np.array([ [ф/аспект, 0, 0, 0], [0, ж, 0, 0], [0, 0, (далеко + близко) / (близко - далеко), (2 * далеко * близко) / (близко - далеко)], [0, 0, -1, 0] ]) glLoadMatrixd(perspective_matrix.transpose()) защита основной(): pygame.init() дисплей = (800, 600) pygame.display.set_mode(display, DOUBLEBUF | OPENGL) set_perspective_matrix(45, (display[0] / display[1]), 0.1, 50.0) glTranslatef(0.0, 0.0, -5) draw_cube() pygame.display.flip() пока правда: для события в pygame.event.get(): если event.type == pygame.QUIT: pygame.quit() покидать() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) глПушМатрикс() # Переносим по оси X Translation_matrix = np.array([ [1, 0, 0, 1,5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]) глобальные вершины вершины = np.dot(вершины, Translation_matrix.T) # Выполняем изометрическую проекцию isometric_matrix = np.array([ [0,707, -0,408, 0,577, 0], [0, 0,816, 0,577, 0], [-0,707, -0,408, 0,577, 0], [0, 0, 0, 1] ]) вершины = Multiple_matrix_vector(isometric_matrix, vertices.T).T draw_axes() глПопМатрикс() draw_cube() pygame.display.flip() pygame.time.wait(10) если __name__ == "__main__": основной() Однако при внесении изменений возникла ошибка: Строка 49 result[i] = temp_result ~~~~~~^^^ ValueError: установка элемента массива с помощью последовательности. Когда я делаю следующую модификацию: список(результат)[i] = temp_result Я получаю новую ошибку: строка 64, glVertex3fv(вершины[вершина][:3]) IndexError: неверный индекс скалярной переменной. Не могли бы вы мне помочь?