我創建並顯示了數千個vtkPlaneSources,但是一旦顯示圖形就顯示緩慢。我正在嘗試使用vtkGlyph3D或vtkGlyph3DMapper來解決此問題,但平面方向存在問題。我懷疑這是由於飛機的定義方式。甲vtkPlaneSource是由這2種方法之一所定義:VTK:Orient and Scale許多飛機
1)起點,點1 & POINT2
2)中心&正常
下面的代碼縮放正常,但我不理解基於所得到的面取向在我指定的法線上。我假設如果我定義了一個法線向量,我會有一個與法線垂直的平面。在我看來,飛機可能沿着每個軸線定向。 vtkGlyph3D和vtkGlyph3DMapper都具有相同的行爲。
在這種情況下,我如何正確使用平面法線定向?
vtkSmartPointer<vtkPoints> glyphPoints =
vtkSmartPointer<vtkPoints>::New();
glyphPoints->InsertNextPoint(0, 0, 0);
glyphPoints->InsertNextPoint(2, 0, 0);
glyphPoints->InsertNextPoint(4, 0, 0);
vtkSmartPointer<vtkPolyData> polydata =
vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(glyphPoints);
vtkSmartPointer<vtkDoubleArray> planeNormals =
vtkSmartPointer<vtkDoubleArray>::New();
planeNormals->SetName("orientArray");
planeNormals->SetNumberOfComponents(3); //3d normals (ie x,y,z)
planeNormals->SetNumberOfTuples(polydata->GetNumberOfPoints());
// Construct the normal vectors
double pN1[3] = { 1.0,0.0,0.0 };
double pN2[3] = { 0.0,1.0,0.0 };
double pN3[3] = { 0.0,0.0,1.0 };
// Add the data to the normals array
planeNormals->SetTuple(0, pN1);
planeNormals->SetTuple(1, pN2);
planeNormals->SetTuple(2, pN3);
polydata->GetPointData()->SetNormals(planeNormals);
vtkSmartPointer<vtkDoubleArray> scaleVectors =
vtkSmartPointer<vtkDoubleArray>::New();
scaleVectors->SetName("scaleArray"); //3d scaling
scaleVectors->SetNumberOfComponents(3); //3d scaling (ie x,y,z)
scaleVectors->SetNumberOfTuples(polydata->GetNumberOfPoints());
// Construct the scale vectors
double sV1[3] = { 1.0,2.0,1.0 };
double sV2[3] = { 1.0,3.0,1.0 };
double sV3[3] = { 1.5,4.0,1.0};
// Add the data to the vector array
scaleVectors->SetTuple(0, sV1);
scaleVectors->SetTuple(1, sV2);
scaleVectors->SetTuple(2, sV3);
polydata->GetPointData()->SetVectors(scaleVectors);
vtkSmartPointer<vtkPlaneSource> planeSource =
vtkSmartPointer<vtkPlaneSource>::New();
// Visualize
vtkSmartPointer<vtkGlyph3DMapper> glyph3Dmapper =
vtkSmartPointer<vtkGlyph3DMapper>::New();
glyph3Dmapper->SetSourceConnection(planeSource->GetOutputPort());
glyph3Dmapper->SetInputData(polydata);
glyph3Dmapper->SetScaleArray("scaleArray");
glyph3Dmapper->SetScaleModeToScaleByVectorComponents();
glyph3Dmapper->SetOrientationArray("orientArray");
glyph3Dmapper->Update();
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(glyph3Dmapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderer->SetBackground(.3, .6, .3); // Background color green
renderWindow->Render();
renderWindowInteractor->Start();
附僅縮放的(1)平面的圖像:
(2)平面縮放並 「取向的」(代碼以上結果):
感謝您的幫助。