Я использую Octree в своей игре и использую код Morton (z-order) для навигации по нему. ВЫШЕ, ПОЧЕМУ - Узлы вставлены в неправильные позиции (скриншоты, неглубки). br /> Здесь есть важные фрагменты кода, пожалуйста, помогите: < /p>
Morton Support Arrays Init, Mortonmapping для обращения с истинного локального IDX, Z- Заказано локальный IDX и наоборот < /li>
< /ol>
static Utils()
{
thresholds[0] = Consts.Lod0Range;
for (int i = 1; i
< /ol>
public static ulong MortonEncode(Vector3Int vector)
{
if (vector.x < 0 || vector.y < 0 || vector.z < 0)
throw new System.Exception("Negative morton");
ulong answer =
morton256[0][(vector.x >> 16) & 0xFF] |
morton256[1][(vector.y >> 16) & 0xFF] |
morton256[2][(vector.z >> 16) & 0xFF];
answer = answer > 8) & 0xFF] |
morton256[1][(vector.y >> 8) & 0xFF] |
morton256[2][(vector.z >> 8) & 0xFF];
answer = answer
Получить локальный индекс ребенка из кода Morton для конкретного уровня Octree < /li>
< /ol>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int MortonIndexForLevel(int level, ulong mortonIndex)
{
return (int)(mortonIndex >> (level * 3)) & 0b111;
}
< /code>
Получите локальную позицию ребенка из кода Мортона (по сравнению с родителем) - это используется в рисунке, что я не включаю, как я Я уверен, что проблема в механизме вставки < /li>
< /ol>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector3Int FlatIndexToVector(int realIdx)
{
return new Vector3Int((realIdx & 4) >> 2, (realIdx & 2) >> 1, realIdx & 1);
}
< /code>
рекурсивная вставка < /li>
< /ol>
//coords are relative to world 0,0,0 measured in smallest possible node size
public void Insert(byte lod, Vector3Int coords, NativeArray data)
{
EnsureSpace(coords);
Chunk chunk = !data.IsCreated ? null : new Chunk(data);
ulong idx = Utils.MortonEncode(coords - beginCorner); //Substract beginCorner of octree in order to localize coords
//Debug section, no logic here
Vector3 center = FromGlobalCoords(coords) + Vector3.one * (1 = parentCenter.z)
index |= 1;
Debug.Log("Indexes: " + index + ", " + curIdx + "\n" + Convert.ToString(index, 2).PadLeft(3, '0') + "\n" + Convert.ToString(curIdx, 2).PadLeft(3, '0'));
if (lod == value.Lod)
{
parent[index] = value;
return;
}
if (parent[index] == null)
parent[index] = new Node(lod);
InsertRecursive(parent[index], value, idx, parentCorner + Utils.FlatIndexToVector(index) * (1
Подробнее здесь: https://stackoverflow.com/questions/794 ... orton-code
Как ориентироваться в Octree с помощью кода Morton? ⇐ C#
Место общения программистов C#
-
Anonymous
1738860884
Anonymous
Я использую Octree в своей игре и использую код Morton (z-order) для навигации по нему. ВЫШЕ, ПОЧЕМУ - Узлы вставлены в неправильные позиции (скриншоты, неглубки). br /> Здесь есть важные фрагменты кода, пожалуйста, помогите: < /p>
Morton Support Arrays Init, Mortonmapping для обращения с истинного локального IDX, Z- Заказано локальный IDX и наоборот < /li>
< /ol>
static Utils()
{
thresholds[0] = Consts.Lod0Range;
for (int i = 1; i
< /ol>
public static ulong MortonEncode(Vector3Int vector)
{
if (vector.x < 0 || vector.y < 0 || vector.z < 0)
throw new System.Exception("Negative morton");
ulong answer =
morton256[0][(vector.x >> 16) & 0xFF] |
morton256[1][(vector.y >> 16) & 0xFF] |
morton256[2][(vector.z >> 16) & 0xFF];
answer = answer > 8) & 0xFF] |
morton256[1][(vector.y >> 8) & 0xFF] |
morton256[2][(vector.z >> 8) & 0xFF];
answer = answer
Получить локальный индекс ребенка из кода Morton для конкретного уровня Octree < /li>
< /ol>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int MortonIndexForLevel(int level, ulong mortonIndex)
{
return (int)(mortonIndex >> (level * 3)) & 0b111;
}
< /code>
Получите локальную позицию ребенка из кода Мортона (по сравнению с родителем) - это используется в рисунке, что я не включаю, как я Я уверен, что проблема в механизме вставки < /li>
< /ol>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector3Int FlatIndexToVector(int realIdx)
{
return new Vector3Int((realIdx & 4) >> 2, (realIdx & 2) >> 1, realIdx & 1);
}
< /code>
рекурсивная вставка < /li>
< /ol>
//coords are relative to world 0,0,0 measured in smallest possible node size
public void Insert(byte lod, Vector3Int coords, NativeArray data)
{
EnsureSpace(coords);
Chunk chunk = !data.IsCreated ? null : new Chunk(data);
ulong idx = Utils.MortonEncode(coords - beginCorner); //Substract beginCorner of octree in order to localize coords
//Debug section, no logic here
Vector3 center = FromGlobalCoords(coords) + Vector3.one * (1 = parentCenter.z)
index |= 1;
Debug.Log("Indexes: " + index + ", " + curIdx + "\n" + Convert.ToString(index, 2).PadLeft(3, '0') + "\n" + Convert.ToString(curIdx, 2).PadLeft(3, '0'));
if (lod == value.Lod)
{
parent[index] = value;
return;
}
if (parent[index] == null)
parent[index] = new Node(lod);
InsertRecursive(parent[index], value, idx, parentCorner + Utils.FlatIndexToVector(index) * (1
Подробнее здесь: [url]https://stackoverflow.com/questions/79416702/how-to-navigate-octree-using-morton-code[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия