сетка без полей на основе вокселей в Octree для LOD - PullRequest
0 голосов
/ 13 июня 2019

Octree

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

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

У лица может быть несколько соседей или часть соседа.

Например:

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

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

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

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

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

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

Мои идеи:

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
}

1 Ответ

0 голосов
/ 20 июня 2019

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

...