При построении мира из блоков квадратной сетки есть ли способ смешать различные множители высоты, чтобы края блоков совпC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 При построении мира из блоков квадратной сетки есть ли способ смешать различные множители высоты, чтобы края блоков совп

Сообщение Гость »


Я работаю над процедурно генерируемым миром. Мир построен из блоков сетки. Каждый чанк имеет свой собственный множитель высоты, который используется для установки высоты вершин. Однако, поскольку наличие разных множителей высоты между фрагментами, конечно, приведет к тому, что края фрагментов не будут совпадать, мне нужно смешать эти множители вместе. В настоящее время, когда вершина устанавливает свою высоту, она просматривает множители высоты всех окружающих блоков (включая чанк, которому она принадлежит) и находит их средневзвешенное значение на основе расстояния между вершиной и центром соответствующего фрагмента. Этот код выглядит следующим образом:

public static float GetWeightedHeightMultiplier(ListaroundChunks, Vector3 vertexPosition, Vector2 chunkCenterPosition) { //surroundingChunks — это список фрагментов ландшафта вокруг фрагмента, которому принадлежит vertexPosition. //и включает в себя и этот фрагмент, то есть 9 фрагментов, за исключением случаев, когда речь идет о фрагментах на краю карты Vector2 корректировкаPos = новый Vector3(chunkCenterPosition.x + vertexPosition.x, chunkCenterPosition.y + vertexPosition.z); поплавок FinalHeight = 0; foreach (чанк TerrainChunk в окруженииChunks) { Расстояние с плавающей запятой = Vector2.Distance(chunk.chunkCenterPosition, AdjustPos); //foreach chunk, находим расстояние от текущей вершины до центра этого чанка вес float = 1 — (расстояние/TerrainGeneration.meshWorldSize); //meshWorldSize — длина стороны одного из фрагментов/ максимальное расстояние, на котором вершина может находиться от центра другого фрагмента. если (вес > 0) { FinalHeight += вес * chunk.heightMultiplier; //находим средневзвешенное значение множителей высоты блоков, исходя из расстояния до блоков } } вернуть окончательную высоту; } Строка: «if (weight > 0)» гарантирует, что будут учитываться только ближайшие 4 множителя высоты. Я использую такой метод, как билинейная выборка текстур.

Но, к сожалению, это не совсем работает. Края действительно совпадают, но теперь в сетке присутствуют круглые артефакты:
Изображение



Изображение


Мне кажется, что я занимаюсь математикой по кругу, а не по квадрату, но здесь я теряюсь. Любая помощь будет принята с благодарностью
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»