[РЕШЕНО] numpy повернуть 3D модель

подскажите, как в numpy повернуть все вершины модели вокруг своей или другой оси.
как повернуть одну вершину я знаю, но проблема в том что перебором на питоне на десятках-сотнях тысяч вершин это работает чрезвычайно медленно. (((
или есть какой другой способ?

некоторые могут сказать что модель можно позиционировать с помощью ОpenGL, да это очень быстро получается, но как мне узнать текущие координаты вершин 3D модели в мире используя ОpenGL?

используются pyglet, numpy и их возможности.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Еще из курса векторного анализа помню, что поворот фигуры в евклидовом пространстве можно проделать умножением на матрицу поворота. Ну а для перемножения матриц есть функция numpy.dot, которая вовсе не требует "перебора"
делаю приблизительно так

from pyrr import Quaternion
import numpy as np
points = ((1., 2., 3.), (1., 2., 3.), (1., 2., 3.), (1., 2., 3.), (1., 2., 3.), (1., 2., 3.))
points = np.array(points)

matrix = Quaternion.from_y_rotation(np.pi / 2.0)

points = points.dot(matrix)
print(points)

получаю ощибку

Traceback (most recent call last):
  File "/home/antavr/PycharmProjects/AegisLuna-master/1.py", line 8, in <module>
    points = points.dot(matrix)
ValueError: shapes (6,3) and (4,) not aligned: 3 (dim 1) != 4 (dim 0)
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
from pyrr import Quaternion, Vector3
import numpy as np
points = ((1., 2., 3.), (1., 2., 3.), (1., 2., 3.), (1., 2., 3.), (1., 2., 3.), (1., 2., 3.))
points = np.array(points)

matrix = Quaternion.from_y_rotation(np.pi / 2.0)

points = [matrix * Vector3(v) for v in points]

print(points)
вот так работает, но это перебор....
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
У вас проблема с пониманием операций над матрицами. При умножении матриц число столбцов левой матрица должно быть равно числу строк правой.
У вас левая 6х3, правая - 4х1. Такие матрицы невозможно перемножать по определению.
К сожалению, по использованию библиотек ничего не подскажу. Читайте доки.
kurych
У вас проблема с пониманием операций над матрицами.
так это и понятно...
но как это сделать правильно, вот в чем вопрос... как я умею это работает медленно (((
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
блин, в ОpenGL это делается элементарно.
    def draw(self):
        gl.glLoadIdentity()

        # gl.glTranslatef(self.position.x, self.position.y, self.position.z)

        gl.glRotatef(self.orientation.x, 1, 0, 0)
        gl.glRotatef(self.orientation.y, 0, 1, 0)
        gl.glRotatef(self.orientation.z, 0, 0, 1)

        # gl.glScalef(self.scale, self.scale, self.scale)

        self.model.draw()
правда после этого вершины модели не меняются (((
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Мне сдаётся, в данном случае еще присоединяется проблема непонимания семантики Кватерниона. Я тоже не эксперт в 3D моделировании, но кватернион - не матрица преобразований. Если посмотреть документацию даже по диагонали, то кватернион преобразуется к матричному виду функцией Matrix33.
Если попробовать добавить
from pyrr import Matrix33
то
points = points.dot(Matrix33(matrix))
уже выглядит более исполнимо. Но я далеко не уверен, что это даст верный результат. Потому что кватернионы, если я правильно понимаю, придуманы как раз для того, чтобы избежать матричных преобразований. А мы в этом случае наоборот от него вернулись к матрице.
ИМХО, нужно до просветления почитать теорию применения кватернионов в 3Д графике вообще и в данной библиотеке в частности, если есть желание это применять.
PS: прошу прощения, но далее углубляться в теорию компьютерного 3D не имею возможности. Умываю руки и желаю удачи в решении задачки.
kurych
если есть желание это применять.
есть желание хоть что то применить, что бы быстро работало )))
как видно с перемещением и масштабом я разобрался, а вот с поворотом проблемка...
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
kurych, благодарю за наводку.
да, оказалось все просто, нужно вершины dot-ить на Matrix33.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
 
Зарегистрироваться или войдите чтобы оставить сообщение.