Как я могу преобразовать карту высот unity в целочисленный массив VBA
Я борюсь с расшифровкой карты высот в игре Unity, написанной на C# с использованием VBA, чтобы затем разработать генератор ландшафта для игры.
Я читаю двоичный файл игры в массив байтов, и в переменной точке файла (он состоит из переменного числа фрагментов переменной длины - каждый с заголовком) находится карта высоты, содержащая 513 x 513 4-байтовых значений.
Я могу без труда найти начало карты высот, посмотрев на ее строку заголовка.
Значения для каждого пикселя высоты имеют длину 4 байта и, по-видимому, хранятся в младшем байте - > старшем байте с максимальным значением в старшем байте, по-видимому, &h3F-любое значение выше этого, и высота местности интерпретируется и отображается игрой как минимум.
Игра, которая генерирует файл данных, написана на c# (кем - то другим-у меня нет навыков c#), используя Unity3d в качестве движка.
Кто-нибудь может просветить меня, пожалуйста?
Что я уже пробовал:
Я попытался извлечь 1052676 байт данных о высоте и записать их в двоичный файл с помощью "Put", который затем закрываю и снова открываю, чтобы "получить" данные в массив 513x513 типа long. Это не работает. Хотя я не получаю сообщения об ошибке, я также не получаю никаких данных. Я пробовал искать форматы данных c#/VB, но не смог найти решение. Я пробовал читать справку по VBA и пробирался через VBA для чайников, но безуспешно.
Я могу программно влиять на изменение высоты рельефа, но манипулирование значениями байтов в виде набора из четырех отдельных чисел является громоздким, а эффекты изменений в 4-м байте удивительны.
Gerry Schmitz
Вы меняете карту, а затем смотрите, как это влияет на игру. Вот как вы перепроектируете, по крайней мере, в этом случае.
Потому что вы, кажется, сопоставляете "байты с длинными", не показывая / не зная "почему".
Member 14100511
Бесполезный Грег. Однако как вы думаете, я выяснил, что такое данные о росте, какие данные о цвете, какие данные об активах?
Я делаю это, потому что хочу написать генератор случайной местности для игры - функция, которую не предоставляли оригинальные разработчики, - и это будет чертовски намного проще, если у меня будет массив целых чисел, чем массив байтов.
Maciej Los
Работа с изображениями в VBA - это кошмар! VBA не для таких вещей! Он был написан для поддержки программ MS Office для управления объектами и автоматизации данных. Я бы настоятельно рекомендовал отказаться от этой идеи как можно скорее.
Member 14100511
Я не работаю в VBA для обработки изображений Maciej.
Я работаю в VBA, чтобы создать массив чисел 513x513, который я вставлю в игровой файл, который затем будет считан игровым движком. Я просто надеюсь, что кто - то там знает, как Unity/C# хранит данные heightmap.
Это 4 байта, да, и моей первой мыслью было, что это стандартное длинное целое число, но в игровом движке изменения в 1-м байте кажутся незначительными, 2-й байт незначительным, 3-й байт заметным, но 4-й байт!
Значения от 0 - &h39 и значения выше &h3f все приводят к нулевой высоте на игровой карте, значения между ними, похоже, генерируют порядки изменения высоты - а не простые степени двух.
Мое предположение состояло в том, что данные хранятся в стандартном формате MS, и это просто мое отсутствие знаний о внутренних компонентах платформы MS coding, что сдерживает меня, но, возможно, это не так. Я в недоумении.
Peter_in_2780
Рассматривали ли вы, что значения могут быть поплавками, хранящимися в Литтл-эндиане? Взгляните через эту линзу, посмотрите, есть ли в этом какой-то смысл.
Maciej Los
Взгляните сюда:
Формат местности - Divinity Original Sin Wiki[^]
Управляемые Учебники DirectX: Часть 7 - Использование Карт Высот[^]
Member 14100511
Спасибо Мацей. Это действительно полезно. Я прочту его внимательно.
Я добрался туда на данный момент, вероятно, очень неэффективным алгоритмом. Я слишком много думал и был сбит с толку тем, что видел в игре в результате своих манипуляций. Я написал пару коротких подпрограмм, которые преобразуют 4 байта в длинные и обратно, в пределах ограничений max/min, которые интерпретатор terrain накладывает на высоту. Теперь я могу преобразовать любой из опубликованных генераторов рельефа, вставить выходные данные в карту рельефа и посмотреть, что получится.
Maciej Los
Приятно слышать, что вы решили свою проблему (или, возможно, ее часть)!
Овации
Мацей