object layer
UpdateObjectsFunctor
가 수행합니다. layer_functors_[DsgLayers::OBJECTS] = std::make_shared<UpdateObjectsFunctor>();
UpdateObjectsFunctor
는 callUpdateFunctions()
함수에서 호출됩니다. UpdateObjectsFunctor
함수는 디포메이션 그래프의 최적화가 완료된 후에 각 레이어(객체, 장소 등)를 업데이트합니다.callUpdateFunctions()
함수에서는, 객체(2) 레이어를 포함한 DSG의 모든 레이어를 Functor를 통해 업데이트 UpdateObjectsFunctor::call()
함수가 실행됩니다.merge_tracker
를 통해 추적합니다. src/backend/update_objects_functor.cpp
파일은 속성 업데이트, 병합 제안, 그리고 관련된 최적화 로직
이 구현되어 있습니다. mesh_connections
속성(메쉬와의 연결 정보)을 병합utils::mergeIndices
함수를 사용하여 각 노드의 mesh_connections
속성을 통합mesh_connections
을 이용해 객체의 메쉬(geometry)를 업데이트hooks()
메서드는 객체 업데이트 시 사용할 추가적인 훅(hook)을 반환하는 역할mergeObjectAttributes
함수를 merge
훅으로 등록하여 객체 간의 병합이 가능하도록 합니다.LayerView
객체를 사용하여 객체 레이어를 생성객체 속성 업데이트:
updateObjectGeometry()
함수를 호출하여 객체의 메쉬 정보를 최신 상태로 갱신 clone()
)하여 dsg.graph
에 반영합니다.병합 여부 확인:
info->allow_node_merging
)이 활성화되어 있지 않으면, 병합을 건너뜁니다.proposeMerge()
함수를 호출하여 특정 객체를 다른 객체와 병합할지 여부를 제안합니다.proposals
리스트에 추가하여 최종 병합 목록을 생성합니다.call()
메서드는 객체 레이어의 각 노드에 대해 속성을 업데이트하고, 필요에 따라 병합을 제안하는 과정을 수행합니다. node_finders
를 사용하여 객체를 찾으며, 이때 위치 정보(좌표)를 바탕으로 검색std::nullopt
을 반환하여 병합하지 않음을 나타냅니다.proposeMerge()
는 특정 객체가 다른 객체와 병합할 가능성을 탐색하고, 객체의 물리적 위치나 bounding box의 포함 관계를 바탕으로 병합 가능성을 판단합니다.call()
메서드는 모든 객체 노드를 순회하며, 각각의 속성을 최신 상태로 갱신합니다.proposeMerge()
를 호출하여 병합 가능성을 탐색합니다. 병합이 제안되면, 제안된 병합 후보는 최종적으로 처리됩니다.updateObjectGeometry()
함수를 통해 메쉬의 변형을 반영합니다.hydra/utils/mesh_utilities.h
와 mesh_utilities.cpp
: updateObjectGeometry
)와 관련된 구체적인 동작을 확인할 수 있습니다.src/utils/mesh_utilities.cpp
파일에서는 메쉬(mesh) 데이터를 기반으로 객체의 위치(centroid)와 bounding box를 업데이트하고, 메쉬 블록들을 관리하는 기능들을 구현하고 있습니다. NodeAttributes
)에 반영하는 역할을 합니다.초기화: 중심 좌표 centroid
를 Eigen::Vector3d::Zero()
로 초기화하고, 유효한 좌표의 개수를 추적하기 위해 num_valid
변수를 0으로 설정합니다.
인덱스 순회: 주어진 indices
벡터를 순회하면서, 각 인덱스에 해당하는 메쉬의 좌표를 가져옵니다.
mesh.pos(idx)
를 호출하여 인덱스에 해당하는 메쉬 좌표를 가져옵니다. 이 좌표는 Eigen::Vector3d
형식으로 변환됩니다.유효한 좌표 확인: 메쉬 좌표가 유효한 값인지 확인합니다.
pos.array().isFinite().all()
을 통해 좌표 값이 유한한지 확인합니다. 만약 유한하지 않다면 해당 좌표를 무시하고 다음 인덱스로 넘어갑니다.중심 좌표 계산:
centroid
에 더해줍니다. num_valid
를 증가시킵니다.평균 계산: 모든 인덱스를 순회한 후, 유효한 좌표의 개수가 0이 아닌 경우, centroid
를 유효한 좌표의 개수로 나누어 평균을 계산합니다. 이를 통해 객체의 중심 좌표를 계산하게 됩니다.
객체 속성 업데이트: 계산된 중심 좌표를 attrs.position
에 저장합니다. 이때, 유효한 좌표가 없으면 false
를 반환하여 업데이트 실패를 알립니다.
updateNodeCentroid()
함수는 주어진 메쉬 인덱스를 바탕으로 객체의 중심 좌표(centroid)를 계산하는 알고리즘입니다. 좌표가 유효한지 확인하고, 유효한 좌표만으로 중심을 계산하여 객체의 위치를 갱신합니다.
메쉬 연결 정보 설정:
indices
가 제공되지 않으면, 객체의 mesh_connections
정보를 사용하여 메쉬의 연결 정보를 설정합니다. Bounding Box 생성:
BoundingBox::MeshAdaptor
를 사용하여 메쉬 데이터를 BoundingBox
에 맞게 적응시킵니다. adaptor
는 mesh_connections
또는 indices
에 해당하는 메쉬 데이터를 기준으로 객체의 bounding box를 계산할 수 있게 도와줍니다.BoundingBox
객체를 생성하고, 객체의 bounding_box
속성을 업데이트합니다. 중심 좌표 업데이트:
updateNodeCentroid()
함수를 호출하여 객체의 중심 좌표를 계산합니다. 이때, indices
가 제공되면 해당 인덱스를, 그렇지 않으면 mesh_connections
을 기반으로 중심을 계산합니다.결과 반환:
true
를, 실패하면 false
를 반환합니다. 이를 통해 객체의 기하학적 속성 업데이트 성공 여부를 알립니다.updateObjectGeometry()
함수는 객체의 bounding box와 중심 좌표를 메쉬 데이터로부터 계산하여 객체 속성에 반영하는 역할을 합니다. 이를 통해 객체의 물리적 특성을 최신 상태로 유지할 수 있습니다.
updateObjectGeometry()
함수는 메쉬의 연결 정보를 사용하여 객체의 bounding box와 중심 좌표를 업데이트합니다. 이 과정에서 updateNodeCentroid()
함수를 호출하여 중심 좌표를 계산합니다.getActiveMesh()
함수는 전체 메쉬에서 활성화된 블록만을 추출하여 효율적인 메쉬 구조를 만듭니다. 이는 메쉬를 처리할 때 불필요한 데이터 처리를 줄여줍니다.