Эффективное программирование 3D-приложений с помощью Irrlicht и jython. Часть 2

В прошлый раз мы остановились на выборе 3D-движка, который будем использовать для этой серии уроков. В качестве основы был использован ресурс сайт . Если вы открыли и внимательно его изучили, то нашли три интересные колонки, в которых перечислены "самые- самые" рейтинга 3D-движков. Первая из них — самые популярные или лучшие (мне трудно выделить какое-либо из этих двух слов) движки на лицензии open source (упрощенно говоря, с открытым исходным кодом и бесплатно). Хотя, по правде говоря, это не всегда синонимы — часто с открытыми кодами поставляются и коммерческие продукты. Это важно, например, если вы начинаете проект TheGame!, который использует библиотеку X, и ваш бюджет порядка двух лет. За это время выйдет несколько очередных версий данной библиотеки X от ее поставщика, вносящих определенные изменения. Но вы будете параллельно реализовывать их сами, внося в исходники той версии, которая была актуальна на стадии начала проекта, т.к. не уверены в том, что эти изменения авторами будут внесены, не уверены, что они будут реализованы именно так, как вам нужно. Поверьте: смена технологии или версии используемого ПО в середине проекта почти всегда приводит к его откату на начальную стадию, а может, даже еще хуже. Люди ведь не машины, которые набирают код и получают в обмен за это деньги. Нам хочется видеть и ощущать прогресс, видеть то, что мы делаем: "вот смотри какая классная штука получается". Если же этого не происходит, возникает разочарование, и разработчики бегут прочь от такого мертвого проекта. Так бывает, если, конечно, Архитектор Проекта, создавая Т.З. — Техническое Задание — причем именно так — с большой буквы, не учел перспективу смены движка, языка, технологии. Не зря же ведущий программист или архитектор получает гораздо больше любого даже самого квалифицированного программиста (просто выполняющего план). Вторая колонка на странице devmasters — платные движки. Сразу скажу: если вы хотите заниматься разработкой профессионально, т.е. пытаться зарабатывать деньги, то покупка лицензии может стать для вас наилучшим выбором. Я уверен, что, если бы разработчики коммерческого движка делали некачественную вещь или не оказывали поддержку покупателям, отвечая на их вопросы и быстро (действительно быстро) исправляя ошибки, они бы вышли из большого бизнеса. Что делать, конкуренция — акулы бизнеса не дремлют.

Теперь о деньгах. Существуют разные финансовые политики — как именно вы платите за используемый движок. Я имею в виду не технический вопрос, как перевести деньги — для этого вам потребуется просто карточка Visa — ее вполне можно оформить, если у вас есть паспорт. Я говорю именно о методике отчислений. Вариант номер один: деньги платятся сразу и все. В этом случае вы перечисляете компании-продавцу денежки, получаете договор, ключ, диск с ПО, секретный пароль для входа в раздел поддержки сайта компании и можете делать с этим движком все, что угодно, для одного, двух, десяти проектов, продавая их любым тиражом. Момент в том, что действительно качественный движок (на уровне современного Quake4 с поддержкой новомодных 3D-технологий и грамотной физики и средствами программировании AI, поддержкой сети) будет стоить под сто тысяч, а то и больше, и явно не белорусских рублей. Для многих начинающих команд или одиночек это непосильная трата. Поэтому есть вариант два: вы платите, скажем, пару тысяч за движок, но компания получает отчисления с каждого проданного диска, скажем, 10%. Конкретные цифры вы узнаете, когда будете заключать договор, но идея должна быть вам понятна. Правда, при этом вы должны быть юридическим лицом. Если вас интересует не gamedev, а задачи визуализации математических поверхностей, физических или химических процессов, то предыдущие варианты слишком громоздки. Вариант три, наверное, самый подходящий для нас — движок того же Quake4 вы не купите, но, заплатив пару сотен, получите в вечное пользование без лицензионных отчислений вполне неплохой движок. Например, в рейтинге того же devmasters первое место занимает (по крайней мере, на момент написания данного материала) torque, SDK для которого (проще говоря, набор средств разработчика — тех самых библиотек функций, очень часто без дополнительных сред программирования, адаптированных под специфику используемого языка или библиотек) стоит порядка 150, плюс за дополнительные деньги вы получаете компакт-диски с ресурсами в виде текстур, моделей персонажей, строений или gamebuilder — уже визуальной среды программирования. Так что одна месячная зарплата, и вы счастливый обладатель всего этого. Заодно это хороший способ проверить серьезность своих намерений или намерений вашей команды. Как известно, время гораздо дороже денег. Третья колонка на сайте devmasters — это движки, которые обновились в последнее время. Здесь вы можете найти ссылки на пока еще неизвестные широкой общественности, но быстро развивающиеся проекты.

Мы же уделим внимание все же колонке №1 рейтинга самых-самых. На первом месте находится OGRE (его сайт ogre3d.org), есть и русское коммьюнити по адресу orge3d.org.ru. OGRE расшифровывается как объектноориентированный движок рендеринга. Чтобы писать на нем вам, нужны знания C++ и методик ООП. Термин "движок рендеринга" говорит, что ничего, кроме графических средств, в OGRE нет, нет физики, ai, сети и gui. Но количество подпроектов OGRE, добавляющих данные возможности, очень велико. Чтобы оценить возможности OGRE, посмотрите на вышедшую где-то год назад (скоро должно быть дополнение) игру "Стальные Монстры" на тему моря, кораблей и битв второй мировой войны. На сайте orge3d.org.ru в разделе форума был разговор в стиле вопрос-ответ между сотрудниками фирмы-разработчика и фанами OGRE — великих секретов раскрыто, конечно, не было, но получить заряд бодрости духа вполне можно.

Второе место занимает irrlicht — его сайт сайт . Irrlicht — это open source 3D-движок, написанный на C++. Может быть запущен на windows, linux, mac, также разрабатываются портированные версии для xbox, psp. С его помощью можно разрабатывать коммерческие приложения. Существуют bindings (механизмы, позволяющие вызывать функции, написанные на одном языке, например, C++, из другого языка, например, C#) для perl, python, lua, .net, java. Irrlicht построен по принципу микроядра и позволяет выполнять 3D rendering с помощью opengl, directx 8,9. На отлично реализована поддержка наиболее известных форматов 3D-моделей и изображений. Так, нарисовав красивую модельку персонажа в 3dsmax, вы можете импортировать ее в среду irrlicht, а не строить из элементарных блоков вроде куба, сферы, конуса. В irrliht реализована поддержка 2D GUI, а также интеграция с физическими движками: ODE, Newton. Есть, правда, негативный момент в том, что русскоязычных ресурсов, посвященных irrlicht, кот наплакал. С помощью google нашлось несколько ресурсов, заглохших пару лет назад, да и то большей частью их информационное наполнение — калька с официального английского сайта, причем устаревшая. Максимум, что можно найти, — пара переведенных уроков из тех, что поставляются вместе с irrlicht, — в общем, смотри gamedev.ru. Плюс изредка поднимаются темы на разных форумах, но такой мощной русскоязычной поддержки, как у ogre, пока нет. Отчасти причина в том, что ogre постарше, отчасти — из-за слабой раскрутки. Для того же ogre есть изданные книги, разумеется, на английском, и, разумеется, купить их можно только на amazon.

Почетное третье место занимает проект jmonkeyengine (jme). Довольно неожиданно. Дело в том, что данный движок полностью написан на java. Разумеется, в основе своей непосредственно отрисовка выполняется с помощью средств opengl. Однако третье место более удивительно из-за того, что разработка движка ведется очень неровно. Периоды бурной активности сменяются полугодовыми затишьями, когда изменения недоступны не только в виде полноценных релизов, но даже в cvs-репозитарии (cvs — система управления версиями исходных файлов и прочих ресурсов проекта) глухо. Пару слов о CVS/SVN. Вкратце идея в том, что представьте, будто вы пишите заказчику программу "калькулятор" — разумеется, работа идет коллективная, — и у нас работают два программиста: Вася и Петя. Очевидно, что чем больше участников проекта и чем больше файлов, которые содержат исходный код, тем больше средств и сил нужно тратить на противодействие силам хаоса. Если Вася внес какие-то изменения в код, то это изменение журналируется, определяется, что было до и что стало после него, и ставится задача оповещения Пети о том, что Вася внес некоторые изменения. Следовательно, Петя должен регулярно закачивать к себе на рабочее место изменения, сделанные Васей, причем так, чтобы не затереть те изменения, которые за это время внес он сам. Представим себе развитие ситуации, когда наши два программиста сдали проект калькулятора заказчику и начали следующую версию уже с 12 разрядами. Через год заказчик звонит нашей команде и сообщает, что обнаружил ошибку при делении 5 на 2 — следовательно, необходимо внести изменения именно в ту версию, которую получил заказчик, а не в ту, над которой наши разработчики работают сейчас. Умножим количество разработчиков на 10, а заказчиков — на 100 и получим... В общем, вы догадались, что мы получим, если не будем использовать специализированное ПО для управления версиями и изменениями в составе проекта. Это и есть CVS и SVN — две наиболее известные и широко применяемые технологии. Чаще всего с помощью CVS или SVN вы выкачиваете к себе изменения, сделанные за прошедшую ночь, и должны их сами собрать — читай: скомпилировать. Чего не скажешь о форуме и wiki проекта — здесь активность не утихает ни на минуту. Есть подпроекты, позволяющие выполнять интеграцию jme с физическими движками. Есть подпроект jmonkey world editor — программа, позволяющая визуально проектировать 3D-мир. Реализованы конвертеры наиболее известных форматов 3D-моделей в формат, который используется jme. Есть и примеры успешно завершенных проектов.

За чертой лидеров, но не за чертой внимания находится panda3d. Вот здесь момент. В отличие от трех предыдущих кандидатов, это не только 3D- движок, а комплексное решение для разработки 3D-игр или приложений. Здесь есть и графика, и физика, и звук, найдется поддержка работы с сетью и многое другое. Для использования panda3d вам будут нужны знания в области языка python. Разработка panda3d ведется рядом американских университетов и используется в рамках их образовательных программ. Официальный сайт: сайт

Очевидно, что инструмент мы выберем не по принципу, кто занимает первое место, а основываясь на возможностях и перспективах достижения нашей конечной цели, сформулированной в первой статье. А кроме того, конечно, очень важен фактор, "с чем я лучше всего знаком". А лучше всего я знаком с irrlicht. Так что остается выбрать только язык программирования, и здесь не все так однозначно. Казалось бы, раз библиотека irrlicht написана на C++, то код для доступа к ее возможностям мы также будем писать с помощью С++. Нет, лучше мы пойдем другим путем. Сначала небольшой экскурс в историю. Давным-давно, когда я только начинал заниматься программированием, меня, скажем прямо, злило то, что я вынужден тратить достаточно много времени на компиляцию и сборку разрабатываемого проекта. Скажем, проект на C++ объемом порядка 50.000 строк (примерно, конечно) собирался порядка 20 минут на очень хорошей по тем временам машине (во время чего можно было смело идти курить, так как что-то делать на машине со стопроцентной загрузкой процессора было просто нереально). Может быть, конечно, я что-то делал не так, но похожий проект на Delphi ребятами из соседней комнаты собирался за время, в течение которого горит спичка, а нам всякие хитрости с прекомпилированными заголовками (идея в том, что ведь не все же 50000 строк проекта изменяются каждый раз, поэтому имеет смысл разделить проект на части и компилировать их отдельно, перекомпилируя только то, что изменилось) и опциями компилятору помогали мало. Ладно, на конечной стадии, если делается проект, для которого критически важна скорость работы, и даже 10% могут стать критерием, покупать или нет, высокая оптимизация кода просто необходима. Но на стадии обучения или быстрого создания прототипа — нет, и еще раз нет — я хочу получить результат за приемлемое время, я хочу работать в максимально интерактивном режиме: внес изменения — сразу посмотрел, что получилось, подправил и снова посмотрел изменения. В конце концов, сейчас ведь не 70- е годы, когда программисты отдавали свой исходный текст девушкам-перфораторщицам, которые набивали их на перфокарте. Затем перфокарты неслись в вычислительный центр, и лишь спустя неделю разработчики получали сообщение об ошибке в программе — бывает, забыл преобразовать угол падения, скажем, луча света, из градусов в радианы, и неделя работы насмарку.

В общем, есть в irrlicht подпроект jirr. Вы ведь помните, что каждый подпроект — это плюс балл к оценке качества нашего 3D-движка. Данный подпроект поставил своей целью дать возможность вызывать функции irrlicht из такого языка, как java. А из java можно использовать средства языка jython. Как, вы еще не знаете, что это за язык? Все очень просто: это реализация на языке java языка python. Понятнее не стало? Ладно, тогда разложим все по полочкам. Есть языки компилируемые, и есть языки интерпретируемые, разница между ними в наше время как-то сгладилась, но отличительные черты сохранились. Представьте себе, что меня пригласили читать лекцию, скажем, по основам программирования на jython, в Campbridge, а английского я, к сожалению, не знаю. Итак, в общем случае у меня есть два подхода. Первый из них — взять текст моей лекции, пойти к профессиональному переводчику, который за деньги, зато с гарантией качества переведет этот материал на английский язык, напишет мне этот перевод транслитерацией, даже с учетом особенностей местного акцента (если это хороший переводчик), и я буду говорить студентам: "Хелло ворлд, деар стъюдентс…" — разумеется, я не понимаю ни слова из того, что говорю, но при условии, что студенты не будут задавать вопросов из аудитории, я достигну поставленных задач. Другой подход — взять в аудиторию вместе с собой переводчика, который все, что я буду говорить, будет переводить слушателям, а все, что они будут спрашивать у меня — переводить мне. Минусы и плюсы очевидны: при втором подходе мы приобретаем интерактивность общения, но теряем скорость. Что составляет собой качество — сложный вопрос — иногда важнее скорость, скажем, если это лекция, как у нас в ВУЗах любят, под диктовку, иногда важнее возможность задать вопрос по ходу лекции. Итак, первый подход — подход компилирования, второй — соответственно, интерпретирования. В случае компилирования исходный текст программы преобразуется в двоичный код, исполняемый непосредственно на процессоре, во втором же случае исходный код поставляется вместе с исполняющей машиной — тем самым переводчиком, который на лету переводит команды, написанные на высокоуровневом языке (такую программу мы называем скрипт), в двоичный код конкретного процессора. python очень известный язык используется как встраиваемый язык программирования в том же openoffice, blender, разные игры используют в качестве скрипта для написания ai именно python. В крайнем случае, даже если вы не будете использовать python для 3D-графики, знания в нем вам пригодятся в веб-программировании. И это в отличие от всяких доморощенных XScript, YScript, ZScript — очень простых и понятных скриптовых языков (как пишут о них в рекламе), часто встраиваемых в некоторые коммерческие и не очень 3D-движки. Но, и это очень важно, которые не имеют никакого применения вне сферы этого движка. У python есть множество альтернативных сфер применения, и это не единственный скриптовый язык — есть еще ruby, php, lua, perl и многие другие.

Теперь разберемся с тем, кто такой jython? В общем, идея в том, что python — это не конкретный продукт, а скорее стандарт языка, определяющий, какими функциями он должен обладать, какие должны быть правила его грамматики и лексики. Естественно, могут параллельно существовать несколько реализаций данного стандарта. Также очевидно, что какую бы из реализаций, прочитав толстую книжку вроде "Python 2.1 Bible", вы ни взяли, можете сразу начинать по ней программировать. Так, есть cpython — реализация интерпретатора python на C, и jython — реализация python на java. Но, и в этом самое вкусное, jython — не просто брат-близнец cpython, отличающийся только разными командами разработчиков и двумя буквами в названии, но и тем, что предоставляет возможность из скрипта python использовать возможности java. А, с тем, что в java за прошедшие годы наработаны и отлажены тысячи библиотек и полезных функций, спорить никто не будет. Последний момент: почему именно jython, а не python? Увы, хоть биндинги для python есть, но их разработка ведется, скажем прямо, нерегулярно, в отличие от jirr. Тогда следующий логический вопрос: почему jython, а не непосредственно java? Я не настаиваю на идеальности своего выбора, более того, как человек искушенный и в python|jython с одной стороны и java с другой, я бы выбрал именно java, но для учебных целей чем проще язык, тем легче. А сделать "быстрый старт" на python гораздо легче, чем на java. Кроме того, за счет некоторых своих языковых особенностей python более активно формирует навыки культуры программирования. Разумеется, что в общем случае cpython быстрее, чем jython, но, может, стоит просто выгрузить из памяти компьютера лишние ненужные утилиты и начать наслаждаться этим отличным коктейлем.

В такой связке irrlicht — jirr компания Xenoage Software ( сайт ) разработала 3D-игру-футбол Slam Soccer 2006. Получится ли у нас нечто подобное, я еще не знаю, но, как говорится "дорогу идущий осилит".

black zorro


Компьютерная газета. Статья была опубликована в номере 05 за 2007 год в рубрике программирование

©1997-2024 Компьютерная газета