Как ориентироваться в Octree с помощью кода Morton?C#

Место общения программистов C#
Ответить
Anonymous
 Как ориентироваться в Octree с помощью кода Morton?

Сообщение 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

Подробнее здесь: https://stackoverflow.com/questions/794 ... orton-code
Ответить

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

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

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

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

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