1.保存圖片
在工程應用中,需要對三維場景進行抓拍,形成圖片,採用vtkWindowToImageFilter
和vtkJPEGWriter
即可完成該功能。核心代碼如下:
_renderWindow->Render();//對當前場景進行渲染
vtkSmartPointer<vtkWindowToImageFilter> wti = vtkSmartPointer<vtkWindowToImageFilter>::New();
wti->SetInput(_renderWindow);
vtkSmartPointer<vtkWindowToImageFilter> jpegWriter = vtkSmartPointer<vtkJPEGWriter>::New();
jpegWriter->SetFileName(filename);//設置圖片保存路徑
jpegWriter->SetInputConnection(wti->GetOutputPort());
jpegWriter->Write();//執行保存
_renderWindow->Finalize();
運行結果就是將三維場景存儲爲圖片,如下圖:
2.座標系轉換(World->View)
在工程應用中,會需要對保存的二維圖片進行標註操作,即在圖片上標註特定的三維點。此時需要擁倒座標系轉換。由於相機處於世界座標系下,因此首先需要將Model座標系轉化爲World座標系。當得到目標點的World三維座標之後,通過WorldToView()
變換可將座標系轉化到View。代碼如下:
double view[3];
_render->SetWorldPoint(x, y, z, 1);//輸入待換算三維點座標
_render->WorldToView();//執行座標變換
_render->GetViewPoint(view);//讀取變換結果,u=view[0] v=view[1]
實際應用中,如果需要對大量點進行變換,可以採用讀取變換矩陣,自行操作圖像變換。代碼如下:
//當場景不變化時,通過render對應的camera讀取到變換矩陣
double mat[16];
vtkMatrix4x4::DeepCopy(mat, _camera->GetCompositeProjectionTransformMatrix(_render->GetTiledAspectRatio(), 0, 1));
//下邊對單獨的點(x,y,z)進行轉換
double view[4];
view[0] = x * mat[0] + y * mat[1] + z * mat[2] + mat[3];
view[1] = x * mat[4] + y * mat[5] + z * mat[6] + mat[7];
view[2] = x * mat[8] + y * mat[9] + z * mat[10] + mat[11];
view[3] = x * mat[12] + y * mat[13] + z * mat[14] + mat[15];
if (view[3] != 0)
{
view[0] /= view[3];
view[1] /= view[3];
view[2] /= view[3];
}
int u = (view[0] + 1.0)*_windowWidth / 2;//_windowWidth爲RenderWindow的寬度
int v = _windowHeight - (view[1] + 1.0)*_windowHeight / 2;
測試的三維映射到二維圖片的結果如下: