среда, 14 сентября 2011 г.

PyWeek 13. Третий день конкурса.

Третий день конкурса PyWeek 13 закончился, но я все еще не написал в блог об своих наработках, а это плохо, ведь по правилам конкурса в блог надо писать часто. Третий день был намного продуктивнее по сравнению со вторым, сделал я не очень много, но все-же зачатки есть. Я написал класс Point3D (Point3D.py) который описывает точку в 3D пространстве, но с дуру не наследовал его, поэтому этот класс уже описывает не точку, а целый элемент из структуры ДНК. Моя структура ДНК это халтура, вернее это собранные в цепочку шарики, ничего общего с ДНК они не имеют, хотелось бы сделать закрученную структуру, но такая структура убьет всю механику игры. Все что я сделал за все это время можно увидеть здесь:
И так, обо всем и по немного. На видео видно как вращается мое бутафорное ДНК. Вращается оно в трехмерном пространстве. Каждый кружек – это часть ДНК, и объект класса Point3D (Point3D.py). Этот класс имеет три свойства – xpos, ypos и zpos, эти свойства описывают положение точки в трехмерном пространстве. Свойства vx, vy, vz, используются для указания вектора движения точки, но покаместь эти три свойства не используются, связано это с тем, что не готова механика игры. Далее идут два свойства – x и y, в эти свойства проецируются координаты по всем трем осям. Все остальные свойства описывают структуру элементов ДНК. По своей структуре это 2.5D графика, тоесть все рассчитывается в трехмерных координатах,  но отрисовывается с помощью 2D инструментов. Отрисовывается все очень просто, банальным 2D кругом. Зная перспективу и насколько эта точка находится в глубине (свойство zpos), я могу вычислить нужный радиус круга, и отрисовать этот круг, в проецированных на двухмерную плоскость трехмерных координат (свойства x и у). Мое проецирование 3D в 2D не очень навороченное, я использовал те формулы, которые мне давали на уроках геометрии в 10 классе, я не очень сильно знаком c 3D графикой и т.д. (я если быть точнее, то я вообще с ней не знаком) и думаю что есть более мощные алгоритмы проецирования, но школьный алгоритм работает тоже на славу (не зря я в школе учился, наконец-то хоть в чем-то пригодилась). Главная проблема была с сортировкой объектов, для этого я описал «список отрисовки», по своей структуре это банальный массив объектов Point3D, сортирую я его с помощью lambda-функции (функциональное программирование – такое функциональное).
Использовать трехмерное пространство в двухмерном игровом движке это не лучшее решение, но все-же выглядеть это круто, разве я не прав? Но и о проблемах стоит сказать тоже, в 3D графике есть такое понятие как перспектива, из за нее объекты, которые находятся на определенном расстоянии по оси Z от центра, должны менять свой размер. Как в PyGame динамически менять размер для 100 различных объектов (именно столько объектов в тестовом ДНК), я не знаю, это главная проблема на сегодня. Еще одна проблема заключается в том, что PyGame не воспринимает дробные числа, он работает только с int, это плохо, очень плохо, покаместь я использую дробные числа, но это ни есть хорошо, надо как то решать это. Так же есть проблема с отрисовкой соединения, соединения видимо тоже придется сортировать, а покаместь они выглядят так:
Сейчас все на этапе «бутофория», но у меня в планах серьезно этим заняться.
Вот и все. Всем удачи. Пока.