Раскрою карты! Расскажу о моём методе рендера карты в деталях.
Карта высот не рендерится напрямую. Вместо этого рендерится круг вокруг камеры, состящий из полосок треугольников, завёрнутых в кольца. Вот, как он выглядит:
Для наглядности примера я взял радиальную детализацию в 10 градусов (т.е. круг разделён на 36 кусков). В проге у меня круг был разделён на 250 кусков.
Похоже на расплющенный глобус, не так ли?
Если представить, что координатная сетка представляет собой плоскую карту высот в привычном виде, то вот как круг будет выглядеть на ней, если смотреть со стороны:
Круг плавно двигается вместе с игроком и не изменяет своей геометрии в горизонтальной плоскости. Однако высота каждой вершины в круге вытягивается из карты высот вершинным шейдером, как цвет из текстуры и подставляется как y координата. Координаты x,z вершины, разделённые на разрешение текстуры превращаются в s,t координаты текстуры карты высот. Какая конкретно мипмапа используется (уровень детализации) - зависит от длин граней, с которыми вершина контачит. Это число заранее просчитывается и хранится в вершинном буффере круга замест неиспользуемой y-координаты.
Итак, в чём же суперность сего метода? Сперва глянем на ландшафт, отрисованный обычной сеткой:
Дело в том, что чем дальше ячейка карты от камеры, тем меньший размер на экране она занимает. В итоге, дальние ячейки, каждая из которых стОит 2-х треугольников, превращаются в 1 сраный коричневый пиксель на экране, в то время как ближние ячейки расфлюстрачиваются на полэкрана. И если мы решим увеличить дальность видимости в 2 раза, то количество треугольников возрастёт в 4 раза, и всё это ради 3хпиксельного прыща на горизонте! Не рационально.
Ну а теперь взглянем, как будет выглядеть геометрия круга, если поставить камеру чуть-чуть выше его центра:
О, чудо! Каждая ячейка круга (трапеция), как ближняя, так и дальняя, на экране по ширине одинаковы! Это достигается за счёт того, что дальние ячейки больше ближних по размеру. И при этом каждое кольцо круга содержит одинаковое количество треугольников. Это значит, что при той же радиальной детализации увеличение дальности видимости в 2 раза потребует в
2 раза больше треугов, а не в 4. И постойте-ка, ведь каждое новое кольцо шире по размеру, и значит увеличение кол-ва колец в 2 раза увеличит дальность видимости
более чем в 2 раза!
Теперь поговорим о радиальной детализации. Перспективная проекция, наблюдаемая нами в любой гуле, характеризуется углом обзора. В моей проге он был выставлен в 120 градусов по горизонтали. Если бы радиальная детализация круга была 1 градус, то он состоял бы из 360 полосок, из которых треть была бы в поле зрения. Это значит, что наблюдаемая зона ландшафта рисовалась бы 120ю полосками. На картинке выше видно, что все полоски на экране имеют одинаковую ширину. Это значит, что каждая из них занимает 1/120 часть экрана. При разрешении в 1024 пиксела по ширине это есть около 8ми пикселов. В моей проге полосок было в полтора раза меньше (250), посему каждая полоска рисовала 12пикселевый столбик экрана.
В идеале, разумеется, полосок на экране должно быть столько же, сколько пикселей, т.е. 1024, и в сумме это 3072. Нехило так, да?
Я думаю, читая это всё, у Вас проскочила мысль: а нафига рисовать те полоски, что сзади и сбоку от наблюдателя? Верно. Но только для случая, когда ландшафт ровный, и камера лежит на земле. А что будет, если посмотреть под ноги? О Боги, я на краешке пропасти!!!
Надеюсь, в общем понятно. Интересный подход, не так ли?
Добавлено спустя 10 минут 18 секунд:
smt005 писал(а):
2 Шаман Как ты определял что камера контактирует с поверхностью?
По карте высот сверялся, Ваш КЭП.
При проваливании в землю камера насильно вытягивалась вверх, и выдавался недовольный бип.
smt005 писал(а):
И как ты делал плавное движение?
Перменная скорости. Если ВПЕРЁД, например, зажата, то к скорости прибавляется столько-то. Если ВПЕРЁД не зажата, скорость умножается на 0.9. Каждый кадр, шо по таймеру фигачит, камера передвигается вперёд на значение скорости.
Там у меня скорости по направлениям разбиты.
Камеру как класс не юзаю - напрямую с модельновидовой матрицей работаю.