用vtk畫拋物面

主要運用vtk中vtkQuadric函數

僞代碼

void ModleData::drawParaboloid()
{
	float radius = data[7];
	float temp = -4 * data[8]; // data[7] 表示焦距
	vtkSmartPointer<vtkQuadric>quadric = vtkSmartPointer<vtkQuadric>::New();
	quadric->SetCoefficients(1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, temp, 0.0);

	//二次函數採樣分辨率
	vtkSmartPointer<vtkSampleFunction>sample = vtkSmartPointer<vtkSampleFunction>::New();
	sample->SetSampleDimensions(40, 40, 20);
	sample->SetImplicitFunction(quadric);
	double xmin = -radius, xmax = radius,
		zmin = 1.0f / temp, zmax = - radius * radius / temp + zmin;
	sample->SetModelBounds(xmin, xmax, xmin, xmax, zmin, zmax);
	vtkSmartPointer<vtkContourFilter> contourFilter = vtkSmartPointer<vtkContourFilter>::New();
	contourFilter->SetInputConnection(sample->GetOutputPort());
	contourFilter->GenerateValues(1, 1, 1);
	contourFilter->Update();

	vtkSmartPointer<vtkPolyData> polyData = contourFilter->GetOutput();
	vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();

	// 用戶自定義平移旋轉 (先移動後旋轉)
	transform->Translate(data[0], data[1], data[2]);
	transform->Translate(0, 0, -zmin);
    transform->RotateWXYZ(data[6], data[3], data[4], data[5]);

	vtkSmartPointer<vtkTransformPolyDataFilter> TransFilter =
			 vtkSmartPointer<vtkTransformPolyDataFilter>::New();
     TransFilter->SetInputData(polyData);
     TransFilter->SetTransform(transform); //use vtkTransform (or maybe vtkLinearTransform)
     TransFilter->Update();
	 polyData = TransFilter->GetOutput();

	//可視化,設置mapper、actor
	vtkSmartPointer<vtkPolyDataMapper>mapper = vtkSmartPointer<vtkPolyDataMapper>::New();

	mapper->SetInputData(polyData);

	actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	

}
運行效果


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