object layerUpdateObjectsFunctor가 수행합니다. 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() 함수는 전체 메쉬에서 활성화된 블록만을 추출하여 효율적인 메쉬 구조를 만듭니다. 이는 메쉬를 처리할 때 불필요한 데이터 처리를 줄여줍니다.