Как использовать перспективную проекцию в этой библиотеке

я нашел библиотеку под названием pyeuclid, и она, кажется, делает то, что я хочу, в отношении трехмерной математики. он включает в себя трехмерный векторный класс и матричный класс 4X4, способный к преобразованиям, таким как вращение, преобразование и масштабирование.

Создание матрицы просто, просто передайте аргументы и матрица будет создана.

>>> m = Matrix4()
>>> m.translate(50,50,50)
Matrix4([    1.00     0.00     0.00    50.00
             0.00     1.00     0.00    50.00
             0.00     0.00     1.00    50.00
             0.00     0.00     0.00     1.00])

Библиотека поставляется с трехмерным векторным классом. Если бы я хотел перевести трехмерную точку с помощью этой матрицы, мне сначала нужно было бы создать векторный класс , как это.

>>> v = Vector3(100,200,300)
>>> v
Vector3(100.00, 200.00, 300.00)
>>> v.x
100
>>> v.y
200
>>> v.z
300

Теперь у класса Matrix4 () есть метод для преобразования координат, который используется следующим образом.

>>> m.transform(v)
Point3(150.00, 250.00, 350.00)

это замечательно, однако, проекция перспективы не применяется, библиотека поставляется с методом Matrix4.new_perspective (fov_y, аспект, ближний, дальний). Вот в чем проблема, я понятия не имею, как правильно использовать эту функцию, (m.transform (vector3) doesent создает что-либо пригодное для использования), документация doesent показывает, как она используется с векторами или другими матрицами, она говорит о том, что она «эквивалентна OpenGL вызывает gluPerspective.fov_y ', но я никогда не использовал opengl, так что это не поможет.

это модуль (из евклида импорта Vector3, Matrix4)

то, что я не хочу, это рекомендации для некоторого игрового движка / библиотеки визуализации или что-то, что склоняется к рисованию чего-либо на экране, я просто хочу знать, могу ли я использовать эту библиотеку, чтобы превратить трехмерные векторные координаты в 2D-экранные координаты, и если не какую библиотеку я могу использовать ???

так что иди туда и выручай новичка в беде! :-) Спасибо за помощь.

13.10.2009 09:14:37
2 ОТВЕТА
РЕШЕНИЕ

В этом руководстве объясняются аргументы функции gluPerspective () , и он должен быть перенесен, поскольку ваша библиотека написана в качестве модели.

Я ожидаю, что метод new_perspective () будет работать как конструктор, то есть он возвращает матрицу, настроенную как перспективное преобразование. После этого вы сможете преобразовывать координаты мирового пространства в проекционные координаты, умножая векторы на эту матрицу.

0
13.10.2009 09:32:05

Я не знаю, относится ли это к делу, поскольку вы, возможно, уже знаете это, но вам также понадобится матрица представления. Матрица представления представляет собой обратное преобразование вашей камеры в мире. Вы можете обнаружить, что у класса матриц также есть вспомогательные методы для создания матриц вида, иногда называемые lookAt os Similar. В качестве альтернативы просто создайте матрицу вручную, которая позиционирует и ориентирует вашу (воображаемую) камеру, а затем инвертируйте ее.

Если вы применяете матрицу проекции к мировым координатам, вы делаете неявное предположение, что ваша матрица вида является тождественной, и поэтому ваша камера находится в начале координат мира и направлена ​​вниз по оси. Какая ось будет зависеть от матрицы проекции, но если она будет такой же, как и в большинстве других систем, то это будет ось z, так как в соглашении глубина камеры измеряется вдоль z. Это может быть как в положительном, так и в отрицательном направлении, поэтому еще раз проверьте документацию для деталей.

Итак, чтобы подвести итог, вам нужно умножить матрицу модели на матрицу вида, а затем на матрицу проекции. Матрица проекции предназначена для работы в координатах камеры, а не в мировых координатах.

0
17.10.2009 12:06:05
вместо этого я использовал этот код focal_length / (focal_length + z), он на 100% идеален, нет необходимости в дорогостоящих вычислениях матрицы, которые вы выразили, и это работает. все равно спасибо за ваши усилия. :)
spearfire 17.10.2009 12:41:13
Я понятия не имею, о чем ты говоришь ... но приятно знать, что ты все равно отсортировал :)
Troubadour 17.10.2009 21:02:49
Кстати, что касается дорогостоящих вычислений матриц, это был только указатель, чтобы вы начали работать с матрицами представлений. Вы не делаете это таким образом на практике.
Troubadour 18.10.2009 18:48:31