主要運用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);
}
運行效果