Member 14100511 Ответов: 1

Как я могу преобразовать карту высот 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

Рассматривали ли вы, что значения могут быть поплавками, хранящимися в Литтл-эндиане? Взгляните через эту линзу, посмотрите, есть ли в этом какой-то смысл.

Member 14100511

Спасибо Мацей. Это действительно полезно. Я прочту его внимательно.
Я добрался туда на данный момент, вероятно, очень неэффективным алгоритмом. Я слишком много думал и был сбит с толку тем, что видел в игре в результате своих манипуляций. Я написал пару коротких подпрограмм, которые преобразуют 4 байта в длинные и обратно, в пределах ограничений max/min, которые интерпретатор terrain накладывает на высоту. Теперь я могу преобразовать любой из опубликованных генераторов рельефа, вставить выходные данные в карту рельефа и посмотреть, что получится.

Maciej Los

Приятно слышать, что вы решили свою проблему (или, возможно, ее часть)!
Овации
Мацей

1 Ответов

Рейтинг:
4

Member 14100511

Итак, то, что у меня есть, это (((b4*256)+b3)*256+b2)*256+b1 с минимальным значением &h00000000 и максимум из них &hFFFF803F. Любое значение выше, который останавливается в Редакторе местности, рабочих

Private Sub CmdMakeTerrain_Click()

pixelheightchange = maxheight / 513
maxheight = 1062273023
r1 = maxheight / 16777216
b4 = CByte(Int(r1))
midheight = maxheight - (Int(r1) * 16777216)
r2 = midheight / 65536
b3 = CByte(Int(r2))
midheight2 = midheight - (Int(r2) * 65536)
r3 = midheight2 / 256
b2 = CByte(Int(r3))
'midheight3 = midheight2 - (Int(r3) * 256)
'r4 = midheight3 / 256
b1 = (r3 - Int(r3)) * 256

End Sub


Я не буду утомлять людей очевидным обратным процессом.

Спасибо всем за вашу помощь.


Maciej Los

Хорошая работа.
Я голосую 5 за поощрение.