бесшовная сетка на основе вокселей в Octree для LOD

Октри

Octree для хранения уровней лодов вокселей, одиночный Octant имеет 16x16x16 вокселей.

Необходимо получить соседние воксели для октанта на всех 6 гранях (у соседа не должно быть дочерних элементов), чтобы создать правильные границы сетки для бесшовной сетки.

Грань может иметь несколько соседей или часть соседа.

Например:

  1. Октант имеет масштаб 64, один сосед имеет масштаб 32 -> один воксель стороны октанта вычисляется из 4 (2x2) соседних вокселей,

  2. Другой сосед имеет масштаб 16 -> один воксель стороны октанта вычисляется из 16 (4x4) вокселей.

  3. Третий сосед имеет масштаб 1 -> Воксель стороны одного октанта вычисляется из 4096 (64 * 64) вокселей.

Octant может иметь слишком много соседей, нужно добавить некоторые ограничения.

При обновлении соседа - установить флаг "границы сетки устарели"

Текущее плохое решение: не получать соседей, поэтому визуализировать все боковые воксели.

Мои идеи:

solution 1:
{
    p_neighbours[Face::FACE_COUNT] in Octant
    create Octant neighbours for all childs on creating
    create Octant neighbours when childs are removed
    update meshs_borders flag when neighbour changed

    Octant with childs has invalid Octant neighbours

    problems:
    Octant can have too many neighbours with different scales, or part of neighbour
    hard to code and maintain, too much cases to solve
    Octant still can have too many neighbours
}

solution 2:
{
    don't store neighbour pointers in childs
    instead get neighbour every time by coordinates

    same problems as in prev solution, and new: 
    can't update "mesh borders out of date" flag when creating or removing childs
}

person Jackalope    schedule 13.06.2019    source источник


Ответы (1)


Я нашел гораздо лучшее решение № 3: воксели границ октанта пусты -> один из 8 вокселей ребенка пуст. Соседи подключены только к октанту с таким же масштабом. Если сосед отсутствует, граничные воксели берутся у соседа родителя.

person Jackalope    schedule 20.06.2019