VTK——保存圖片及座標系變換(World->View)

1.保存圖片

在工程應用中,需要對三維場景進行抓拍,形成圖片,採用vtkWindowToImageFiltervtkJPEGWriter即可完成該功能。核心代碼如下:

_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;

測試的三維映射到二維圖片的結果如下:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章