MeshIntegrator
는 TSDF와 기타 레이어 데이터를 기반으로 메쉬를 생성하는 클래스입니다.processInterior()
및 processExterior()
메서드를 통해 TSDF 데이터의 내부와 외부 영역을 처리하여 메쉬를 생성메쉬 생성의 전체 흐름
generateMesh()
에서 먼저 메쉬가 생성될 블록을 할당하고, 해당 블록의 내부(voxel 내부)와 외부(voxel 경계) 영역을 처리합니다.Marching Cubes 기반 메쉬 생성
Occupancy 레이어 처리
MeshIntegrator::MeshIntegrator(const MeshIntegratorConfig& config)
)역할:
MeshIntegrator
객체를 초기화하는 데 사용되며, 주로 메쉬 통합에 필요한 설정(config)을 전달받아 해당 인스턴스를 설정config
: 메쉬 통합 작업에서 사용될 다양한 설정 값을 담고 있습니다. 이는 MeshIntegratorConfig
구조체를 통해 정의되며, 최소 가중치, 사용 스레드 수, 메쉬를 업데이트할 조건 등 다양한 설정을 포함합니다.generateMesh()
메서드역할:
로직:
1. cube_coord_offsets_
초기화:
cube_index_offsets_
라는 사전에 정의된 행렬을 기반으로, voxel의 좌표 오프셋을 계산합니다. 블록 할당 (allocateBlocks
):
mesh_updated
플래그가 true인 블록)만 처리할지 여부는 only_mesh_updated_blocks
에 의해 결정됩니다.tsdf.blockIndicesWithCondition(TsdfBlock::meshUpdated)
: 메쉬가 업데이트된 블록의 인덱스를 가져옵니다.tsdf.allocatedBlockIndices()
: 할당된 모든 블록의 인덱스를 가져옵니다.allocateBlocks()
함수에서는 각 블록에 대해 메쉬 레이어와 occupancy 레이어에서 필요한 메모리를 할당하고 초기화합니다.내부 및 외부 처리 (launchThreads
):
launchThreads()
를 사용하여 블록 인덱스에 따라 멀티스레드를 통해 내부와 외부 처리를 나누어 병렬 처리합니다. 각 스레드는 내부/외부 블록을 나누어 처리하고 메쉬를 생성합니다.메쉬 업데이트 플래그 처리:
clear_updated_flag
가 true인 경우에는 TSDF 블록의 mesh_updated
플래그를 false로 설정하여 해당 블록이 메쉬 생성이 완료되었음을 나타냅니다.cube_index_offsets_
와 cube_coord_offsets_
:
cube_index_offsets_
는 3D voxel에서 각 꼭짓점(corner)의 상대적인 위치를 정의하는 정수 오프셋입니다. cube_index_offsets_
입니다.cube_coord_offsets_
는 이 인덱스를 voxel의 크기와 곱하여 실제 공간에서의 좌표 오프셋을 계산합니다.내부/외부 처리:
processInterior
)는 TSDF 블록의 내부 voxel을 처리합니다. 이는 일반적으로 경계에 속하지 않는 voxel이므로 처리가 비교적 단순합니다.processExterior
)는 블록 경계를 처리하며, 이는 이웃 블록의 voxel과 연관이 있기 때문에 경계 voxel에 대한 특별한 처리가 필요합니다.멀티스레드 처리:
launchThreads()
함수는 각 블록에 대해 내부와 외부의 메쉬 생성을 병렬로 처리합니다. 주어진 블록 인덱스에 대해 내부 또는 외부 처리를 각각 멀티스레드로 나누어 진행합니다.BlockIndexGetter
를 사용하여 다음에 처리할 블록 인덱스를 가져옵니다. 이를 통해 스레드 간 충돌을 방지하고 블록을 효율적으로 분배합니다.Marching Cubes 알고리즘:
MarchingCubes::meshCube()
함수는 8개의 voxel 데이터를 기반으로 하나의 큐브에서 메쉬를 생성합니다. 이때 각 voxel의 TSDF 값이 사용됩니다.generateMesh()
는 TSDF 데이터를 기반으로 메쉬를 생성하는 주요 함수입니다. 이를 위해 내부와 외부 voxel을 각각 처리하고, Marching Cubes 알고리즘을 사용해 메쉬를 생성합니다.