Я помню шлейфы в EVE. Давным-давно они действительно у нас были. В моей памяти они были прикольными. И красивыми. И так я установил Empyrean Age снова и поиграл немного на одном из наших серверов на «Классическом клиенте», конечно. И тогда я понял, что старые шлейфы были на самом деле очень классные, но не то, что я назвал бы шикарными.
Взгляните, помните их?
Так прошлым летом, когда в офисе было тихо, а у меня было свободное время я опять задумался над шлейфами: почему их убрали в Apocrypha... и самое главное: как их заставить выглядеть лучше и реднериться быстрее.
Мой первоначальный план был сделать их за лето. Я был слишком оптимистичен. Позже выяснилось, что совсем вообще детско-наивно оптимистичен...
Сплайны в помощь!
С самого начала это было довольно ясно, что мы должны использовать сплайны для новых шлейфов. Они дают вам приятные плавные изгибы и позиционируются лишь по паре контрольных точек и нормалей. И их математика достаточно проста, чтобы быть реализованной в вершинных шейдерах, так что нет необходимости обновлять VertexBuffer каждый отдельный кадр для каждого корабля в сцене. Кстати, по такому-же принципу работали и старые шлейфы.
Посмотрите сами, как просты кубические сплайны Эрмита:
Теперь я знал, как создать плавную кривую, но конечно не так, как это происходит при правильном геометрическом искривлении. Плоскостной след? Звездоподобный? Или цепочки частиц? Если честно, я понятия не имел, и я думаю, не я один. Вот некоторые из наиболее перспективно выглядящих результатов:
Как вы можете видеть: не очень красиво. Определенно они работают быстрее, чем старые, и еще быстрее, чем старые вызывают желания отключить их в меню настроек.
Трассировка лучей
И так, очевидно, что форма жесткой геометрии ломает объект на изгибе, заставляя выглядеть его совсем уродливым под определенным углом зрения. Так что теперь я не знал как их делать. В такой момент приходится делать шаг назад и еще раз подумать, чего-бы вам хотелось достичь: отрисовку плавно изгибающегося цилиндра (потому что это и есть шлейф как таковой),светящегося цилиндра, светящегося, плавно-изгибающегося цилиндра.
И тут меня осенило: почему бы не решить проблему с трассировки лучей в пиксельном шейдере? На первый взгляд это звучит немного глупо, но когда вы посмотрите на математику, что это не так сложно. Пересечение луча с конечным цилиндром, безусловно, выполнимо в шейдере и с учетом довольно большого числа тех конечных цилиндров шлейф в результате будет плавно-изогнутым цилиндром.
Математике для пересечения луча с бесконечным цилиндром:
Теперь нам нужно, поделить этот бесконечный цилиндр на конечный при втором условии: направление отрисовки должно перекрываться и ограничиваться кораблем.
В итоге нам удалось получить точку входа и выхода наблюдаемую в конечном цилиндре, в результате чего этот луч и есть шлейф. На основании этого легко выводятся некоторые световые значения:
Остальное просто: закрыть пробелы, применить немного выцветания/затухания и пусть художественный руководитель поиграет с размером, длиной и цветом:
Не обращайте внимание на сервер
Теперь я знал, как сделать шлейфы, но я все равно должен был выяснить, где фактическое положение всех точек сплайна, т.к. контроль будет поступать из них.
(Кстати, уже давно не лето...)
Одна из причин, почему старые шлейфы иногда получались перепутанными и накладывающимися в том, что они полагались на точную позицию корабля диктуемую сервером. Все MMO игроки знают, что это может привести к какому-то странному поведению движения корабля, особенно в ситуации когда вы ловите лаг. Таким образом, для позиционирования шлейфов я должен был игнорировать абсолютные положения корабля, вместо того, чтобы полагаться на быстрый и безошибочный отклик, движение должно быть интерполировано в клиенте (например, скорость, которую вы видите в HUD, никогда резко не изменится). Если вдруг ваш корабль поймает десинк и будет перепозиционирован, шлейфы просто «прыгнут» вместе с кораблем. Вы даже этого не заметите.
И наконец: точки контроля сплайнов проявляются лишь при позиционном смещении вашего корабля. Таким образом, чем быстрее корабль — тем длинее шлейф.
Все это собралось как раз вовремя, чтоб быть выпущенным в Crucible, так что я очень надеюсь, что вы будете наслаждаться новым шлейфами. Я знаю что делал, потому что теперь они так же хороши, какими я их помнил.
Дальнейшее совершенствование
Конечно, всегда есть что-то большее. Некоторая анимация, поглощение света, преломление и т.д. и т.п. Мне хотелось бы тратить больше времени на шлейфы, так что если вам они вам понравились, я мог-бы получить больше времени для реализации всех идей.
Перевод © Loardriver