BSP-деревья решают вопрос сортировки граней по удаленности к наблюдателю, но не решают вопрос отбрасывания невидимых граней. Представьте, что игровой уровень состоит из двух помещений, соединенных коридором. Если игрок находится в помещении 1, он никак не сможет увидеть помещение 2 при условии замкнутости стен. А значит, он не увидит и предметы, и противников, находящихся в помещении 2.
Для определения видимости зон в Quake использовали алгоритм PVS (Potential Visible Set), когда на стадии предварительной обработки для листов BSP-дерева составлялись списки видимых из них других листов дерева. Такая оптимизация дает значительный эффект на больших уровнях, когда отбрасываются значительные части невидимой геометрии.
Editor
Поняв, как работают эти алгоритмы, я решил реализовать их на практике – написать небольшой редактор уровней и визуализатор к нему. Проект назвал Jurassic 3D Engine.
У каждой игры есть свой редактор, где создается геометрия, накладываются текстуры, импортируются модели из 3D Studio Max и т. д. За основу как раз и был взят 3D Studio Max – три проекции и перспектива.
Редактор умел делать базовые вещи:
• создавать примитивы (многоугольники, кубы, сферы, цилиндры);
• накладывать на них текстуры;
• превращать двухмерные многоугольники в трехмерные примитивы вытяжением;
• импортировать сложные модели из 3D Studio Max;
• расставлять источники света.
Весь интерфейс был сделан полностью на OpenGL. На этом редакторе я сделал две небольшие карты: одна с текстурами[10] из Max Payne, вторая – квартира родителей из поселка под Кингисеппом. Под вторую локацию часть текстур пришлось искать в интернете, а другую часть я отснял на цифровую мыльницу. Проблема с отснятым была в том, что при заполнении такой текстурой какой-то поверхности ее противоположные края должны соединяться на стыках без каких-либо графических артефактов.
Завершающим этапом создания карты в редакторе был режим предварительной обработки: построение BSP-дерева, расчет видимости его листьев PVS.
Текстура Наложение текстуры
Rad
Следующий шаг – рассчитать карты освещенности (Lightmaps). Напомню, Lightmap – метод освещения пространства в 3D-приложениях, заключающийся в том, что создается текстура, содержащая информацию об освещенности трехмерных моделей.
Для расчета освещенности я сделал отдельную утилиту Rad. Как следует из сокращенного названия, она рассчитывала также и отраженный свет по алгоритму Radiosity.
Radiosity – это алгоритм расчета освещения, учитывающий отраженный свет. Посмотрите на картинку, на ней комната с синим полом, красным потолком и белыми стенами. На белых стенах появятся красный и синий оттенки.
В Radiosity нет точечных источников света, здесь каждая точка поверхности излучает энергию (свет). Каждая точка поверхности посылает свою энергию всем остальным видимым ей точкам. Часть энергии они поглощают, а часть – отражают. И так бесконечное число раз.
В программных реализациях Radiosity имеют дело не с бесконечным количеством точек, а с конечным количеством маленьких частей поверхности – патчей. Cамый простой алгоритм построения Radiosity: последовательно для кажого патча передавать его энергию всем видимым для него патчам. Тут сразу же возникает проблема в определении видимости одного патча из другого. Придется делать трассировку луча и искать пересечение этого луча со всеми остальными объектами сцены, что очень дорого по вычислениям!
Я поступил несколько иначе. Что если смотреть из центра патча по нормали к поверхности? Мы увидим все то, что видит патч, иначе говоря, мы видим другие патчи, излучающие энергию. Складывая вместе энергию этих патчей, мы можем посчитать количество энергии и света из сцены, достигающей наш патч. Назовем это количество входящим светом (incident light).
В Radiosity нет различия между источниками света и патчами (частями поверхности), а в реальном мире некоторые поверхности излучают свет. Значит, некоторые патчи должны уметь не только поглощать и отражать свет, но и излучать его. Свойство патча, отвечающее за его способность излучать свет, назовем emission. Как раз эмиссию патчей и задавал редактор.
Свойство патча, характеризующее его видимость, это количество излучаемой им в сумме энергии – исходящий свет (excident light).
incident = сумма всего света, который видит патч
excident = (incident * reflectance) + emission
Тогда для расчета освещения нужно выполнить эти две операции для всех патчей в сцене заданное число раз.
Основная проблема, которую предстояло решить, – визуализация сцены из центра каждого патча. Причем обзор должен охватывать полностью то полупространство, в которое направлена нормаль поверхности. Можно взять полусферу и установить на патч так, чтобы центр полусферы совпадал с центром патча, и спроецировать сцену на полусферу. Но ни одна графическая библиотека не позволяет это сделать.
Вместо полусферы используют полукуб (hemicube). Каждая грань куба – перспективная проекция с углом обзора 90 градусов.
Такой алгоритм очень хорошо оптимизируется с помощью железа – графического ускорителя. Нужно визуализировать лицевую грань куба и половинки левой, правой, верхней, нижней частей, соответственно поворачивая камеру. А поскольку в цвете мы ограничены значением от 0 до 1 (0–255), то вместо реальных цветов патчей мы будем использовать указатели на патчи – будем кодировать указатель из четырех байт в четыре компоненты цвета – RGBA. Тогда при рендеринге нужно отключить любое фильтрование, мы же не хотим интерполировать указатели.
Нужно учесть искажения объектов перспективой по краям. Пиксели на поверхности полукуба домножаются на косинус угла между направлением камеры и отрезком, соединяющим центр проекции с пикселем. Также нужно учесть закон косинуса: освещенность поверхности пропорциональна косинусу угла между нормали к поверхности и направлением на источник света.
Карта 1
Поскольку рассчитывать эти величины каждый раз для каждого патча слишком дорого, то разумней подготовить специальную карту, на которую мы будем домножать наш полукуб – multiplier map. Это и делает утилита Rad. При ее запуске параметром задается, сколько проходов (число отражений света) мы рассчитываем. Пересчет карты 2 (квартира) в восемь проходов на Riva TNT Vanta занимал примерно 6–8 часов. Но оно того стоило.
Ко второй версии я добавил зеркала и полупрозрачные поверхности.
Карта 2
На третьем курсе университета я совсем забросил учебу и целый день сидел за компьютером, занимаясь то поисковиком, то 3D-движком. Я пытался собрать единомышленников на форуме GameDev.ru для написания своей собственной игры. У меня была надежда, что ее кто-нибудь заметит и даст начальные инвестиции на более серьезную разработку.
Я переехал из соседнего блока к одногрупнику Вале, через которого я выходил в общажную сеть. Мы полгода жили в трешке вдвоем до новогодней сессии.
На этом же курсе было разделение по кафедрам. Я выбрал кафедру ядерной физики. Перед новым годом я подарил пятизвездочный коньяк «Арарат» заведующему кафедрой. Коньяк не был дорогой, но этот жест очень понравился заведующему. Он сказал, что, в случае каких-либо проблем, я могу обращаться к нему лично.
В конце первого семестра я твердо решил, что пора бы найти работу. Где я мог заработать? Например, разгружая что-то. Я нашел заманчивое предложение в газете о разгрузке мешков с мукой. Физическая форма у меня была хорошая. Я поехал по объявлению в Питер. Там мужики мне объяснили, что в среднем за день нужно разгрузить несколько тонн муки. Если я согласен – меня ждут завтра к 8 утра. Хорошо, что ж, попробую.
На следующий день уже в 6 утра я был на железнодорожной станции. Только вот электричка не доехала до станции «Университет» – сломалась и парализовала все движение. «Значит, не судьба. Видимо, эта работа не для меня», – с икренним облегчением подумал я. И пошел просматривать предложения о работе программистом на популярном тогда сайте job.ru.
Резюме у меня было скромное: студент, знания С/С++, WinAPI, OpenGL, опыта работы нет, для себя программирую такой-то 3D-движок.
Мне ответило несколько компаний. Одна из них – «Адамант Мультимедиа». Это была компания, занимающаяся разработкой 3D Action игр и принадлежащая крупному строительному холдингу «Адамант». Офис «Мультимедиа» располагался практически в центре Питера на Сенной площади. Туда я и поехал на собеседование. Меня встретил технический директор Дамир и провел в «большую программерскую» на четвертом этаже. По периметру кабинета стояло семь столов. На каждом столе по два монитора, под столом – один-два блока компьютеров. Кто-то усердно смотрел в мониторы, кто-то что-то обсуждал.
Дамир предложил мне сесть за стол в центре комнаты и дал листок бумаги. На этом листе было несколько заданий, которые он попросил меня решить. Я никогда не понимал программирования на бумаге. Еще в 11-м классе мы ездили на вступительную олимпиаду по программированию на факультет прикладной математики (ПМПУ). В огромной аудитории собралось около сотни студентов, которым также предложили написать код на бумаге. Организаторы олимпиады подразумевали, что вы должны помнить всю стандартную библиотеку C/C++ (я писал тогда на C++) наизусть. Реально ведь бред. Тогда я не прошел.
Дальше, с моего разрешения, Дамир попросил прислать код моего 3D-движка, чтобы главный программный архитектор компании мог оценить мои профессиональные навыки:
– Зачем вы написали отдельный редактор уровней? Ведь есть тот же 3D Studio Max?
– Просто потому что было интересно.
Но в итоге меня туда не взяли, потому что я все еще учился.
– Учеба будет отнимать много времени, – сказал Дамир и закончил собеседование.
Вторая компания, куда я поехал, располагалась в квартире старого дома. Писали они тоже какие-то игры. У них даже были обеды в виде яичницы от специально приходящей бабушки. Зарплату предлагали совсем копеечную, по меркам Питера, – всего $200.
Третья компания находилась при каком-то институте и занималась автоматизацией железок, типа лазеров и тому подобного. Выслушав меня, мне пафосно отказали: «Слабоват ты, сынок, для нас. Гуляй отсюда».
Куда я ездил еще, уже и не помню.
И тут наступила сессия. Не посещая лекций, я смог сдать практически все предметы, кроме математического анализа. Большинство преподавателей с пониманием относились к тому, что многие студенты на третьем курсе уже работали и редко посещали занятия. Впрочем, это не касалось преподавателей по математическому анализу. Люди старой закалки, видимо, жили грезами о том, что наука у нас в стране все еще кому-то нужна. И если учишься, то должен знать материал.
Матанализ я не сдал, и мне сказали прийти на следующий год. Я решил попробовать подойти к «своему» заведующему кафедрой.
– Я договорился, чтобы ты еще раз пришел сдавать экзамен, – констатировал он.
– Еще раз сдавать? Так я ж ничего не учил, – и я не пошел.
Возможно, он имел в виду, что мне нужно было просто прийти. Но это я уже не узнаю. Думаю, это было к лучшему для меня.
Я вернулся домой и рассказал родителям, что меня отчислили. Мать устроила страшный скандал. «Теперь пойдешь в армию!» – повторяла она. Я сидел дома на стуле испуганный, но не из-за того, что мне гроизила армия. Меня напугала реакция матери. Мне все-таки было уже 19 лет. Тогда я ждал поддержки, но никак не обвинений и упреков. Я собрал вещи и уехал назад, в общежитие. Это был переломный момент. Больше я никогда не спрашивал у родителей, что мне делать, и не просил совета. Нет, я не виню родителей, уверен, что они дали мне все, что было в их силах. Их самих так воспитывали.
На следующий год ситуация с экзаменом повторилась. Я принципиально не стал ничего учить, потому что просто не хотел и не понимал, для чего мне это нужно. В жизни мне эти знания так и не пригодились. Во второй раз экзамен разбили на два дня. В первый день мне попался аспирант, которому я честно сказал, что работаю и уже второй год сдаю. Во второй день – опять принципиальный преподаватель, который поставил неуд.
Университетское общежитие подарило мне прописку в Питере без срока окончания, которой я долго пользовался. А местный военкомат не трогал студентов, даже если вы ежегодно не носили им справки об учебе. Выписали меня из общежития ровно в 27 лет – возраст, после которого в армию уже не призывают. Спасибо им за это.
Отчисленные студенты могли продолжать жить в общежитии, получив разрешение от администрации студгородка, и при условии, что на следующий год они планируют восстанавливаться. Я всегда боялся ходить по этим кабинетам и у кого-то что-то просить из-за своих детских комплексов.
Вариантов у меня особо не было, я пошел в администрацию и попросил не выселять меня.
– Меня отчислили из университета. Теперь возьмете на работу? – написал я в «Адамант».
– Конечно. Приезжайте.
В общем-то, основную роль в моем успешном найме в «Адамант» сыграло как раз мое увлечение 3D-графикой. Сейчас, проводя собеседования с молодыми специалистами на вакансию программиста, я сильно удивляюсь их подходу к делу: «Я ничего не знаю, кроме вузовской программы, дома для себя ничего не программирую. Но вы же меня научите?» А может, вы сами приложите хоть какие-то усилия? Не хотите учиться – идите разгружайте мешки с мукой.
Во втором семестре третьего курса мой сосед Валя один переехал в двушку. Честно говоря, я всегда завидовал умениям других людей так легко общаться и договариваться. Я решил, что и мне надо бы сходить к комендантше с бутылкой коньяка. Очень хотелось пожить одному. Но разговора не получилось: она меня послала вместе с этой самой бутылкой. Зато подселила ко мне двух китайцев-первокурсников.
Я возвращался вечером с работы, а в комнате было не продохнуть от готовки. Но с китайцами я жил недолго. Один из них подобрал на улице бездомного котенка и принес его в комнату общежития, не имея даже малейшего представления, как за ним ухаживать.
Место для котенка китаец сделал из старой коробки, засунув туда свой пуховик. Совсем неудивительно, что котенок обоссал ему всю куртку. На следующий день я заметил, что котенок притих, тогда я взял его на свою кровать. Котенок терпел минуту и насрал мне огромную кучу на матрас. После этого я выставил его за дверь. Кроме туалета и запаха мочи, вся комната за день оказалась в шерсти.
Китайцы всполошились:
– Давай его оставим.
– Нет, от него очень много шерсти. Она повсюду.
Я уехал на работу. Какой же сюрприз ждал меня вечером, по возвращению назад: на полу сидел абсолютно лысый котенок с двумя порезами! А один из китайцев, явно довольный собой, держал в руке машинку для стрижки:
– От него не будет больше шерсти.
– Да вы совсем ебанутые? – не выдержал я и выставил котенка за дверь.
Китайцев явно переклинило – они чуть ли не набросились на меня:
– Сейчас получите пиздюлей! – яростно ответил я.
Китайцев аж затрясло. Тот китаец, который только что держал машинку в руке, схватил два больших ножа. Назревал межрасовый конфликт.
– Перезжайте и заводите, кого хотите, – ответил я безэмоционально.
Подошел к застывшему китайцу, забрал оба ножа и закинул их высоко в антресоль.
На следующий день этих китайцев уже не было. Как я узнал позже, они нажаловались на меня коменде. А та перевела их в VIP-общежитие с отремонтированными блоками, куда я безуспешно пытался попасть за деньги. Не было мест.
Я опять был виноват? Да и насрать. Китайцы так меня испугались, видимо, я и вправду производил грозное впечатление.
Как я узнал позже, вместе со мной в «Адаманте» работало несколько студентов, но более старших курсов и магистратуры. Один из них, Артём, мой будущий начальник, был с моего факультета того же СПбГУ. Правильно, кому еще реализовывать компьютерную физику?
«Адамант» при мне выпустил две завершенные игры – Liquidator 2 и Exodus from Earth. К первой я практически не имел отношения, может быть, за исключением пары баг-фиксов. Но моя фамилия вписана в число разработчиков обеих игр.
Liquidator 2 Welcome to Hell, разработчик Parallax Arts Studio, издатель Russobit-M, 2005
Exodus from the Earth,разработчик Parallax Arts Studio, издатель Strategy First, Inc., 2008
Итак, «Адамант» делился на два больших подразделения: разработки и дизайна. В подразделении дизайна работали аниматоры, художники по текстурам, художники по моделям и даже один композитор. Я же относился к подразделению разработки, которое, в свою очередь, делилось на отдел искусственного интеллекта, состоящий из одного человека, отдел физики, отдел графики и отдел редакторов.
Изначально я попал в отдел искуственного интеллекта. Это отдел, который заставляет компьютерных персонажей бегать, стрелять, думать. Начальником у меня стал Рома. Рома – прикольный человек, полностью погруженный в процесс программирования. Он, недолго думая, мог реализовать практически любой алгоритм. Правда, читабельность, а иногда и эффективность, от этого страдали. До «Адаманта» он успел поработать во многих местах, и даже побыть сантехником. «Сидишь так зимой на горячей трубе в раскопанной трассе, и куришь сигаретку…» – мечтательно рассказывал Рома.
Через две недели ко мне подошел Андрей, руководитель отдела физики, и сказал, что забирает меня к себе. Новость меня шокировала. Во мне заговорила неуверенность, что я справлюсь. Опять будут эти сложные производные и интегралы.
– Дима, а что не так? – спросил Андрей.
– Я только из университета ушел, потому что мне надоела эта физика, а тут опять…
– Рома – слабый руководитель, лучше тебе поработать здесь.
И Андрей оказался прав. За два года работы в «Адаманте» я сильно поднял свой уровень программирования. Например, я научился писать эффективный код, пользоваться профайлером. В компании было правило, что в самых нагруженных местах игра должна давать не менее 30 FPS (Frames Per Second – количество кадров в секунду). Точнее, этого требовал издатель. В игровой движок был встроен внутренний профайлер, показывающий количество миллисекунд на выполнение определенных блоков кода: AI (Artificial Intelligence – искусственный интеллект), Render (отрисовка графики), Physics (физика) и менее важные. Каждый блок можно было развернуть и посмотреть, на каком конкретно коде CPU «сидит» слишком долго. После чего начиналась оптимизация.
Кроме меня в отделе физики был Артём. Интересная закономерность: и Артём и Андрей оканчивали мой физфак СПбГУ. Именно они реализовали игровой физический движок.
Цель любого физического движка – рассчитать взаимодействие объектов, с учетом приложенных сил вычислить скорости и соответственно сдвинуть объекты на время кадра. Во время одного кадра скорость принимается постоянной. Для этого сначала нужно найти точки контакта объектов (их называют Joint’ы), составить большую матрицу с кучей цифр и решить уравнение с этой матрицей. Вот эта часть для меня и была пугающая. Мне очень сильно не хотелось разбираться в подобном. Но ядро функционировало без ошибок. И создание нового объекта в физическом мире, например той же пружины, сводилось просто к описанию параметров Joint’а, а все остальное безошибочно считал уже написанный код.
Существует два подхода к расчету игровой физики: коллизионный и выталкивающий. Коллизионный предполагает рассчитывать точки контакта одного объекта с другим. Если время до контакта меньше времени кадра, то кадр дробится, объекты расталкиваются, и пересчет повторяется снова. Такая физика обладает реалистичной точностью. Но минусов у нее также много: кадр иногда может дробиться на слишком много частей, что приводит к снижению производительности, и даже к откровенным тормозам. Выглядит это так, будто все замирает и начинает подергиваться. Так же, из-за ограниченной точности вычислений, возникают ситуации застревания объектов.
Большинство современных игр работает на выталкивающем принципе. Суть метода в том, что сначала объекты сдвигаются без учета коллизий, а только потом рассчитываются силы, расталкивающие объекты. Представьте, ящик падает на плоскость. Алгоритм будет работать так – на определенном кадре ящик войдет в плоскость. Будут рассчитаны точки приложения выталкивающих сил, направление и величина этих сил. На следующем кадре ящик отскочит от плоскости. Минусы такой физики в том, что при слишком быстрой скорости или малых размерах один объект может проскочить насквозь через другой. В современных физических движках для быстродвижущихся предметов используется смешанный подход, то есть кадр все-таки дробится, чтобы не было проскакиваний насквозь. Большинство сложных объектов в таком мире заменяются боксами, сферами, другими словами – примитивами, при этом страдает реалистичность. Но если бы я об этом не написал, заметили ли бы вы это в Half-Life 2? Думаю, что нет.
Наша физика в «Адаманте» была коллизионной. Захотелось так сделать Андрею с Артёмом. И это решение было ошибочно, что признали потом они сами. Слишком дорого стоил такой подход. Во-первых, вместо примитивов у нас очень любили использовать сложные трехмерные объекты, импортированные из 3D Studio Max. Во-вторых, наша физика начинала очень плохо работать, когда на сцене взаимодействовало несколько динамических объектов. Например, взрыв гранаты рядом с несколькими ящиками мог привести к жутким тормозам (множественные отскоки осколков в течение одного кадра), залипание объектов.
Перечитав кучу зарубежной литературы на английском языке, я нашел описание алгоритмов построения Joint (связей, возникающих при выталкивании объектов друг из друга) для плоскости и бокса, бокса и бокса. Joint предполагалось отдать нашему физическому ядру. Две недели вечернего времени после работы, десятки изрисованных листов А4 в расчете математических формул. И выталкивание заработало для примитивов: плоскость и бокс, бокс и бокс.
Это решение дало возможность делать особые эффекты, такие как разбивание машиной стены ящиков (ящики красиво разлетались вокруг). Отдел дизайна по достоинству оценил мой энтузиазм.
В конце первого года моей работы, а проработал я в «Адаманте» два года, вся компания собралась на конференцию разработчиков игр в Москву. Компания оплачивала сотрудникам переезд и отель. Меня и еще пару человек не взяли, мол, работаете вы недолго, так что в следующий раз. Было обидно.
Как бы могла сложиться дальше моя карьера в геймдеве? Многие «старички» уходили из «Адаманта» в другие компании. В какой-то момент ушел и Андрей. Артём стал моим руководителем. Я прекрасно понимал, что на место технического директора я не попаду. Да и рост зарплаты всегда будет ограничен.
Мой брат Игорь в то время работал в Sun Microsystems, в отделе разработки компилятора Sun C Compiler. Работа в основном сводилась к баг-фиксу – исправлению ошибок. Sun позволяла почти всю неделю работать из дома на расслабоне. В свободное от работы время брат увлекался фотографией. Приобрел себе фотоаппарат Canon EOS 5D.
Как-то неожиданно у моего брата и его друга родилась идея снимать порно. Появилась эта идея у них после посещения тренингов по пикапу в школе РМЭС (Русская модель эффективного соблазнения). Нет, конечно, никакого хардкода, просто сайт в стиле single model, где девушки бы демонстрировали свои прелести в самых разных интерьерах и позах. И брат позвал меня в дело.
Для реализации задумки тут же решено было найти однушку в Питере, где можно было бы проводить пробные фотосъемки. Я в то время все еще жил в общежитии университета.
Квартиру мы нашли рядом с метро «Удельная», в старом сталинском доме: высокие потолки, газовая колонка для горячей воды, минимум мебели. Сами поклеили новые обои. Купили дешевый диван в ИКЕА, который довольно быстро прогнулся.
Фоны решили не покупать в специализированном фотомагазине, а просто взять материю и сшить в ателье.
Для студийной съемки не хватало только профессиональных вспышек и экспонометра[11]. Вытащив заначку, скопленную с зарплаты, мы купили две вспышки Elinchrom FX 400 Вт и одну MarcoPro 600 Вт, комплект зонтиков, экспонометр. В общем, весь необходимый набор. Фотографии получались классные – четкие, разные оттенки кожи, размытый фон.
Дело стало за малым и самым главным – нужно было найти моделей. Каждый стал валить эту обязанность друг на друга, возникло даже предложение снимать просто жопы. «А давайте снимать просто жопы. Сделаем сайт фетиша по жопам», – предложил кто-то. Остановились на том, что на паре форумов разместили сообщения, мол, профессиональная фотостудия ищет девушек-моделей для сотрудничества. Откликов, естественно, почти не было.
В общем, на этом идея снимать порно и закончилась. Я же наконец-то переехал из общежития в Питер, в ту самую квартиру для фотосъемки. Хозяйкой была бабушка, жившая в том же доме. Два раза за полтора года она повышала арендную плату. Каждый раз случался такой диалог:
– Наверное, тебе придется съехать – моему сыночку нужна квартира…
– Может, вам просто больше платить?
– Да, давай поднимем арендную плату.
В очередной раз я ее чуть не послал. Сказал, что в договоре прописаны условия, которые она нарушает. Тут же прибежал ее взрослый сыночек, правда, я так и не понял, чего он хотел.
Следующая идея по заработку денег, которая возникла уже у нас с братом, – снимать свадьбы и детей в детских садиках.
Мы решили обзвонить все детские сады. Точнее, обзванивал их я, с утра, перед работой. Большинству садиков наши услуги были не интересны, не интересна была и цена на них. Везде все было схвачено. В итоге, после нескольких сотен холодных звонков, мы съездили всего в два-три садика и сделали фотографии, которые в конечном итоге не заинтересовали заведующих. Видимо, у них был какой-то другой интерес, а мы, молодые, об этом тогда и не думали.
Про услуги свадебной съемки можно было разместить рекламу в специализированном журнале и получать звонки, но у нас не было портфолио. И его нужно было наработать на каких-то первых заказах. Чтобы получить эти первые заказы, мы решили заняться расклейкой объявлений по столбам вдоль Невского проспекта с текстом: «Свадебная фотосъемка».
В летний выходной день, распечатав несколько сотен объявлений на принтере и вооружившись клеем для бумаги, мы выдвинулись на Невский проспект. Спам фонарных столбов – массированная расклейка объявлений.
Через несколько дней брат получил звонок. Паре требовался свадебный фотограф, и им очень хотелось посмотреть на наши фотографии. Игорь отобрал несколько фотографий, сделанных на улице, и преподнес их как репортажную съемку.
Получив первый заказ и первое портфолио, мы наконец-то смогли дать объявление в профильный журнал по свадебной фотографии. Заказы стали поступать время от времени. Скорее это было просто хобби, а не реальная возможность хорошо заработать. Тем более что снимать ездил только мой брат, а я не сильно горел этой идеей.
8 марта 2005 года на Game Developers Conference 2005 компания Ageia официально объявила о своем намерении вывести на рынок физический процессор собственной разработки – Ageia PhysX PPU (Physics Processing Unit – блок обработки физики). Компания Ageia стала первой компанией, которая разработала аппаратный чип, предназначенный для снятия нагрузки по просчету физики в компьютерных играх с центрального процессора.
В 2006 году две аппаратные карточки Ageia PhysX появились в компании «Адамант Мультимедиа». Одну из них поставили в мой компьютер. По заданию руководства я должен был интегрировать Ageia SDK в наш движок – интегрировать так, чтобы можно было переключиться между физикой нашей собственной разработки и Ageia.
Предлагалось сделать общий абстрактный интерфейс для физической библиотеки, а под ним менялась бы только реализация. Конечно, на словах эту звучало красиво и элегантно, но отделение нашей физики от остальной логики было непростой задачей. И она была одной из последних моих задач в «Адаманте».
CellFactor: Revolution, разработчик Artificial Studios, издатель Ageia, 2007
К железке Ageia можно было скачать демоверсию игры CellFactor: Combat Training. Шутер представлял собой сетевую игру с небольшими уровнями, заваленными разными ящиками, трубами, вагонами, техникой. Все это очень красиво разлеталось от взрывов. Предметами можно было бросаться в противника. Основной целью этой демки была демонстрация Phys X и скорости расчета физики на железке. Стоило только отключить аппаратное ускорение, как весь мир начинал ужасно тормозить и падал FPS.
Писать компьютерные игры я мечтал, наверное, с самого детства. Меня восхищали такие люди, как Джон Кармак. Кармак – один из основателей id Software, компании, выпускающей видеоигры, которые стали популярны и в России. Уже к 1994 году Кармак был настолько успешен, что, заработав приличное состояние, приобрел два автомобиля Ferrari, причем один сразу подарил.
После появления QuakeWorld и Quake II вокруг игры стало стремительно формироваться игровое сообщество, геймеры собирались в компьютерных клубах и проводили небольшие локальные чемпионаты. Несмотря на то что кибертурниры организовывались и до этого, к примеру, в далеком 1980-м Atari провела соревнования по Space Invaders, первым полноценным чемпионатом по компьютерным играм принято считать Red Annihilation по Quake, проведенным в мае 1997 года. С целью повысить накал страстей основатель id Software Джон Кармак пообещал победителю турнира подарить свой собственный автомобиль – Ferrari 328 GTS. В итоге обладателем спорткара стал Денниc Thresh Фонг.
А ко мне опять приходило мрачное понимание того, что дальше меня ждет чертова ипотека на 30 лет, «Доширак» и работа на дядю до пенсии. Нужно было что-то менять.
Начитавшись umaxforum, мы решили заняться black SEO (черной поисковой автоматизацией). В то время и Google, и Yandex, и MSN очень хорошо «ели» генерированный текст – дорвеи[12].
Можно было либо создавать сетки дорвеев низкочастотных ключевых слов, либо делать единичные дорвеи под какие-то жирные запросы (например, такие как «buy viagra online»).
Суть дорвея сводилась вот к чему. Покупался домен, или же использовался уже существующий, например, blogspot.com (старые и авторитетные домены поисковые системы воспринимали лучше), на нем выкладывался генерированный бредовый текст с заданной плотностью ключевого слова.
Тексты генерировали алгоритмом цепей Маркова. Алгоритм позволял создавать более-менее связанный текст, хотя и абсолютно бессмысленный. Генератор сначала обучился на реальном тексте, то есть генератор запоминал, какие пары слов встречаются в реальности. Например, генератор видел словосочетания «лето жаркое», «лето дождливое». Для слова «лето» сохранялись все пары: «жаркое» и «дождливое». При генерации бралось первое слово, допустим «лето», и к нему выбиралась произвольная пара из заранее сохраненных, например «жаркое». Дальше первым словом становилось «жаркое», и весь алгоритм повторялся до достижения заданного размера текста. Часть слов заменялась заданными ключевыми так, чтобы достичь плотности в определенный процент.