안녕하세요. 이번에는 윈도우 좌표를 vtk world 좌표로 변환하는 방법을 알아보겠습니다.
vtk의 경우 오브젝트 가시화를 위해 렌더링을 위한 다양한 기능을 제공하고 있습니다.
그 중 3차원 공간상에 위치한 물체(Object)를 어느 방향에서 어떻게 바라보는가에 따라 화면에 그려지는 결과가 달라지게 됩니다.
VTK에서는 별도 설정을 하지 않으면 기본적으로 렌더러(renderer)에서 카메라를 생성하게 되며, 추가적으로 사용자가 카메라를 조작하기 위해서는 vtkCamera class를 사용하면 됩니다.
이 때, vtkCamera를 통해서 나타나는 monitor screen을 통해서 3차원 객체를 가시화하여 나타나게 됩니다.
예를 들어, 실제 공간에서 책상 위의 컵을 카메라를 통해서 본다고 하면,
실제 공간은 컴퓨터 내부에서 렌더링된 3차원 공간이 되고, 책상과 컵은 그 공간 안에 있는 오브젝트가 됩니다.
카메라를 통해서 보는 monitor screen이 모니터에 그려지는 화면이 됩니다.
모니터 화면을 통해 해당 공간을 나타낸다고 한다면, 모니터는 3차원 공간을 2차원 screen으로 나타내기 때문에
모니터에서 말하는 모니터 좌표와 실제 공간의 좌표는 각각 다르게 나타나게 됩니다.
이 상황을 MFC와 VTK로 적용해 봅시다.
MFC의 Picture control를 사용하여 (Monitor) 그 공간에 vtk의 3차원 공간(실제 3차원 공간)을 그린다고 생각해 봅시다.
이 때, dialog의 특정 좌표에서의 vtk world cordinator 좌표계로 변환하기 위해서는 어떻게 해야할까요.
우선 mfc 좌표계와 vtk 좌표계의 경우 아래와 같이 나타납니다.
mfc의 picture control의 너비와 높이만큼 vtk에서 display할 수 있기 때문에
위의 예시에서 mfc의 (250, 50)좌표의 경우, vtk의 display coordinates 좌표계에서는 (200, 100)에 대응합니다.
vtk display coordinates 좌표계는 vtk의 실제 공간에 해당하는 world coordinates 좌표계로 바꿔주어야 합니다.
이 때 display coordinates의 경우 2차원 좌표계이고 vtk world coordinates는 3차원 공간이기 때문에 z축 좌표는 camera position에 대응하여 나타납니다.
vtk display coordinates 좌표를 vtk world coordinates 좌표로 변환하는 방법은 아래와 같습니다.
// Convert display coordinates to world coordinates
double displayCoord[3] = { 200, 100, 0.0 }; // Example display coordinates
double worldCoord[3];
//double previousDisplayCoord[3]; // Variable to store previous display coordinates
//this->m_pVTKRenderer->GetDisplayPoint(previousDisplayCoord); // Save previous display coordinates
this->m_pVTKRenderer->SetDisplayPoint(displayCoord);
this->m_pVTKRenderer->DisplayToWorld();
this->m_pVTKRenderer->GetWorldPoint(worldCoord);
std::cout << "World coordinates: (" << worldCoord[0] << ", " << worldCoord[1] << ", " << worldCoord[2] << ")" << std::endl;
참 쉽죠 ~?
'Programming > VTK' 카테고리의 다른 글
[VTK] VTK에서 원 그리기 (C++, MFC) (0) | 2024.04.05 |
---|