Как использовать перспективную проекцию в этой библиотеке - PullRequest
0 голосов
/ 13 октября 2009

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

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

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

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

>>> 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, так что это не поможет.

это модуль (из euclid import Vector3, Matrix4)

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

, так что иди туда и помоги Нубу в беде!:-) спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 17 октября 2009

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

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

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

0 голосов
/ 13 октября 2009

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

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

...