본문 바로가기
OpenMesh

Normal

by DarkRock 2024. 11. 21.
반응형

Normal 조회

OpenMesh에서 normal은 아래 그림의 삼각형 메쉬의 정점(Vertex)이나 면(Face)의 법선 벡터를 계산하고 조회하는 데 사용됩니다. 법선 벡터는 메쉬의 기하학적 특성을 표현하는 데 중요한 요소로, 조명, 렌더링, 충돌 감지 등의 그래픽 및 물리 엔진에서 널리 활용됩니다.

Vertex, Face Normal

 

따라서 OpenMesh에서는 normal을 통해 다음 작업이 가능합니다:
- 정점(Vertex)의 법선 벡터 조회 
- 면(Face)의 법선 벡터 조회

 

 

 


C++ 예제 코드

 MyMesh mesh;    
    if (!OpenMesh::IO::read_mesh(mesh, "example.obj")) 
    {
        std::cerr << "Error: Cannot read mesh file." << std::endl;
        return 1;
    }
    mesh.request_vertex_normals();
    mesh.request_face_normals();
    mesh.update_face_normals();    
    mesh.update_vertex_normals();
  
    for (MyMesh::FaceIter f_it = mesh.faces_begin(); f_it != mesh.faces_end(); ++f_it) 
    {
        MyMesh::Normal normal = mesh.normal(*f_it); 
        std::cout << "Face " << f_it->idx() << " Normal: (" 
                  << normal[0] << ", " << normal[1] << ", " << normal[2] << ")" << std::endl;
    }    
    
    for (MyMesh::VertexIter v_it = mesh.vertices_begin(); v_it != mesh.vertices_end(); ++v_it) {
        MyMesh::Normal normal = mesh.normal(*v_it); 
        std::cout << "Vertex " << v_it->idx() << " Normal: (" 
                  << normal[0] << ", " << normal[1] << ", " << normal[2] << ")" << std::endl;
    }

 

 

코드 설명

- mesh.request_vertex_normals() 및 mesh.request_face_normals()를 호출해 메쉬에서 법선 데이터를 사용할 수 있도록 설정합니다.
- mesh.update_face_normals(): 모든 면의 법선을 자동으로 계산합니다.
- mesh.update_vertex_normals(): 모든 정점의 법선을 자동으로 계산합니다.
- mesh.normal(*f_it): 현재 Face의 법선 벡터를 반환합니다.
- mesh.normal(*v_it): 현재 Vertex의 법선 벡터를 반환합니다.



Normal은 메쉬의 기하학적 정보를 분석하고, 변형 및 시뮬레이션 작업을 수행하는 데 필수적인 기능입니다. 위 예제는 법선을 계산하고 활용하는 기본적인 방법을 보여주며, 이를 확장하여 다양한 그래픽 연산에 적용할 수 있습니다.

반응형

'OpenMesh' 카테고리의 다른 글

Delete Vertex  (0) 2024.11.23
Incoming and outgoing halfedges  (1) 2024.11.22
To from vertices  (0) 2024.11.20
FaceEdgeIter  (0) 2024.11.19
FaceVertexIter  (0) 2024.11.18