Перспективная проекция с несколькими 3D-объектами на разной глубине в Python

Для моего личного проекта мне нужно:

  1. Создайте перспективную проекцию 3D-объекта на 2D-плоскость (на точку, определенную в пространстве, которая будет камерой).

  2. Получить точные координаты области/точек перспективной проекции

  3. Создайте перспективную проекцию нескольких 3D-объектов, где одни объекты могут находиться позади других.

  4. Визуализируйте сцену (только одно изображение, анимации не будет, поэтому рендеринг в реальном времени не требуется).

Для пунктов 1,2 и 4 я нашел способ сделать это с помощью PyGame, как описано здесь: http://codentronix.com/2011/04/21/rotating-3d-wireframe-cube-with-python/

Но с пунктом 3 я немного застрял, потому что даже если я могу получить перспективные проекции для каждого из моих объектов, как я могу узнать, какой объект действительно виден, а какой (полный объект или его часть) нет?

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

Например, если матрица содержит все пиксели моего изображения на экране, и у нас есть 10 объектов, мы получим 0, где нет объекта, 1, где мы можем видеть объект n1, 2, где виден объект n2, и т.д..

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

Может ли кто-нибудь помочь мне встать на правильный путь?

PS: побочный вопрос: если бы вы также могли указать мне на более оптимизированную реализацию перспективной проекции и рендеринга, чем PyGame, мне было бы очень интересно!


person gaborous    schedule 18.10.2012    source источник
comment
Я думаю, может быть, мне следует использовать алгоритм столкновений в 2D-пространстве? но проблема здесь в том, что мне нужна координата Z, которая, кажется, также возвращается вместе с точкой 2D-проекции, но действительно ли это будет жизнеспособным решением (я действительно новичок в такого рода игровых вещах).   -  person gaborous    schedule 18.10.2012
comment
Вы пробовали OpenGL? Для него есть оболочка Python (PyOpenGL), которую я успешно использовал в ряде проектов.   -  person nneonneo    schedule 18.10.2012
comment
Если у вас есть перспективная проекция каждого объекта, простой способ устранить скрытые поверхности — нарисовать их задом наперед. Если они состоят из трехмерных полигонов, вам придется собирать, сортировать и рисовать их все таким образом. Другой относительно простой подход заключается в использовании Z-буфера, который в основном отслеживает z-значение поверхности, отображаемое в каждом месте пикселя в массиве изображений. Конечно, все это можно сделать за вас, возможно, аппаратно, если вам разрешено использовать что-то вроде OpenGL или Direct3D (и иметь для них оболочку).   -  person martineau    schedule 18.10.2012
comment
Спасибо за идеи. В самом деле, я думаю, что сделаю устранение скрытых поверхностей, рисуя сзади наперед. Я могу использовать все, что захочу, но я никогда раньше не использовал OpenGL, и, поскольку это низкоуровневый API, я думаю, что мне будет довольно сложно манипулировать им. Что вы имеете в виду, когда говорите, что я могу сделать это на аппаратном уровне? Есть ли в OpenGL уже существующая функция для устранения скрытых поверхностей?   -  person gaborous    schedule 18.10.2012
comment
В конце концов, я перешел на Panda3D, так как теперь прототипировать его быстрее, а позже я могу переключиться на прямое взаимодействие с OpenGL, если это необходимо для производительности. Другими альтернативами являются Soya3D, PySoy или cgkit, все они работают с Python, но Panda3D, безусловно, является самым передовым движком среди них.   -  person gaborous    schedule 21.10.2012


Ответы (1)


Я предлагаю использовать OpenGL для таких задач. Изучение основ OpenGL (и это выглядит очень просто) не требует особых усилий. Взгляните здесь (известное руководство) и здесь (основной пример с использованием Python, Qt и OpenGL). Я думаю, что с некоторыми усилиями это может занять у вас день, чтобы начать.

person hochl    schedule 18.10.2012
comment
Спасибо за ссылки, не знал их, и они приветствуются. Однако это не отвечает на настоящий вопрос, поэтому я просто проголосовал за вас. - person gaborous; 19.10.2012
comment
все еще рад, что смог помочь вам со ссылками - это стоит прочитать. - person hochl; 19.10.2012