Для «классического» трехмерного редактора местности, шаги могут быть такими:
Создайте сетку (например, сетку из квадратов, каждый квадрат состоит из двух треугольников), все вершины разделены между треугольниками (так, чтобы на пересечении была только одна нормаль).
Это должно быть сделано в 3DMesh и отображено в вашей программе.
Создайте инструмент для поднятия и опускания (все меньше и больше) частей сетки (вам нужно вычислить, где на сетке находится курсор мыши, и изменить вершины сетки, но только вверх и вниз).
Создайте большую текстуру (например, 1024x1024x4 или лучше) и наложите на нее текстуру, которая называется splat-map:
Сделайте возможным рисовать его (с помощью R, G, B ИЛИ Alpha, например, не розовый) и выбирать текстуры, заменяющие эти уродливые основные цвета (красный, синий, зеленый, альфа) или, более того, представленные ими:
Шейдер (который вам нужно будет создать) должен умножить эти приятные текстуры (скажем, камень, трава, ...) на интенсивность в splatmap (уродливой), а затем смешать все вместе, чтобы он выглядел, например (с вроде только 2 цвета) вот так:
Извините за большие изображения, я собрал это на работе ...
Первым делом нужно уточнить структуру данных вашего ландшафта и то, что вы хотите от редактора. Это сетка? Массив высот? Какая-то воксельная система в стиле Minecraft? Нужно ли вам добавлять сетчатые элементы местности, такие как деревья и здания? Вручную, автоматически или оба? Я мог бы продолжать, но вы поняли идею.
Базовый редактор ландшафта не так сложно написать, но детали будут сильно различаться в зависимости от игры, которую вы создаете, и, следовательно, от типа ландшафта, который вы хотите создать.
источник
Это всего лишь продолжение ответа Вальмонда, но оно кажется недостаточно коротким, чтобы добавить его в качестве комментария.
Как только вы приступите к созданию основного редактора, вы можете поэкспериментировать, сгенерировав карту высот полностью на GPU. Это совершенно необязательно, но это хороший способ перенести работу на GPU для постоянно меняющейся местности. Вальмонд уже упоминал, что на пиксельном шейдере делаются текстуры, но можно использовать и вершинный шейдер, используя поиск текстуры для поднятия и опускания вершин в сетке. Вот учебник о том, как сделать это с помощью вершинного шейдера. Не-шейдерная штука специфична для C # и XNA, но важная штука в шейдерном коде.
В этом случае ваш код на стороне процессора будет иметь дело только с изменением текстуры в градациях серого, хранящейся в памяти. Ваша сетка сетки остается плоской, вершины не обновляются процессором. Каждый раз, когда текстура изменяется, новая текстура может быть передана в графический процессор.
Имейте в виду, что не все модели шейдеров поддерживают выборку текстур в вершинном шейдере (например, в HLSL вам нужна как минимум модель шейдера 3.0).
источник
Вы можете взглянуть на ETM Огре http://www.ogre3d.org/addonforums/viewforum.php?f=16 , чтобы дать вам некоторые идеи. Artifex Terra основан на этом, если вы хотите увидеть его в действии.
источник