В общем случае, кватернионы повсеместно применяются для вычисления вращений, в том числе и в OpenGL.
Если кратко, то кватернион - это комплексное четырехмерное число, представляющее поворот на определенный угол вокруг направленного вектора. Композиция последовательных поворотов и вращений вычисляется произведением представляющих эти повороты кватернионов, что значительно сокращает количество вычислительных операций по сравнению с матричными вычислениями.
И вот уже когда все повороты сделаны, можно пересчитать результирующие координаты объекта, применив к исходной модели конечный кватернион.
То есть, этот результирующий кватернион преобразуем в трехмерную матрицу поворота и умножаем на нее массив с координатами исходной модели.
Вроде, как-то так это работает.
Мне сдаётся, в данном случае еще присоединяется проблема непонимания семантики Кватерниона. Я тоже не эксперт в 3D моделировании, но кватернион - не матрица преобразований. Если посмотреть документацию даже по диагонали, то кватернион преобразуется к матричному виду функцией Matrix33.
Если попробовать добавить
from pyrr import Matrix33
то
points = points.dot(Matrix33(matrix))
уже выглядит более исполнимо. Но я далеко не уверен, что это даст верный результат. Потому что кватернионы, если я правильно понимаю, придуманы как раз для того, чтобы избежать матричных преобразований. А мы в этом случае наоборот от него вернулись к матрице.
ИМХО, нужно до просветления почитать теорию применения кватернионов в 3Д графике вообще и в данной библиотеке в частности, если есть желание это применять.
PS: прошу прощения, но далее углубляться в теорию компьютерного 3D не имею возможности. Умываю руки и желаю удачи в решении задачки.
У вас проблема с пониманием операций над матрицами. При умножении матриц число столбцов левой матрица должно быть равно числу строк правой.
У вас левая 6х3, правая - 4х1. Такие матрицы невозможно перемножать по определению.
К сожалению, по использованию библиотек ничего не подскажу. Читайте доки.
Еще из курса векторного анализа помню, что поворот фигуры в евклидовом пространстве можно проделать умножением на матрицу поворота. Ну а для перемножения матриц есть функция numpy.dot, которая вовсе не требует "перебора"
А покажите, пожалуйста, вывод команды
pacman -Qs bcache-tools
В /etc/mkinitcpio.conf в HOOKS попробуйте bcache перед block поставить.
Как вариант, для пользователя, под которым работает демон, изменить значение umask
Вы какой-то урезанный кусочек выдернули, да еще никак не связанный с вашим недоконфигом. Найдите в гугле картинки по запросу типа "linux iptables packet flow" и смотрите, что там после чего
Тогда логи смотрите. В том числе и xorg. С учетом того, что xorg с правами пользователя запускается
Не факт, что решит проблему, но все же...
Покажите, в каких группах состоят пользователи, между которыми вы переключаетесь
id user1
id user2