如何使用VTK和C++绘制流线
How to plot streamline with VTK and C++?
我想用VTK可视化C++中的流线。我已经写了一个代码,但它只显示了立方体的边缘,流线是不可见的。这是我的代码:
vtkPoints *p=vtkPoints::New();
vtkFloatArray *vectors=vtkFloatArray::New();
float vector[3];
vectors->SetNumberOfComponents(3);
int sum=0;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
{
p->InsertPoint(sum,k+5.0,j+5.0,i+5.0);
vector[0]=0.5*k+0.1;
vector[1]=0.2*j+0.2;
vector[2]=0.3*+0.3;
vectors->InsertNextTuple(vector);
sum++;
}
vtkCellArray *line=vtkCellArray::New();
line->InsertNextCell(2);
line->InsertCellPoint(63);
line->InsertCellPoint(15);
line->InsertNextCell(2);
line->InsertCellPoint(0);
line->InsertCellPoint(3);
line->InsertNextCell(2);
line->InsertCellPoint(0);
line->InsertCellPoint(12);
line->InsertNextCell(2);
line->InsertCellPoint(12);
line->InsertCellPoint(15);
line->InsertNextCell(2);
line->InsertCellPoint(3);
line->InsertCellPoint(15);
line->InsertNextCell(2);
line->InsertCellPoint(0);
line->InsertCellPoint(48);
line->InsertNextCell(2);
line->InsertCellPoint(48);
line->InsertCellPoint(51);
line->InsertNextCell(2);
line->InsertCellPoint(48);
line->InsertCellPoint(60);
line->InsertNextCell(2);
line->InsertCellPoint(63);
line->InsertCellPoint(60);
line->InsertNextCell(2);
line->InsertCellPoint(12);
line->InsertCellPoint(60);
line->InsertNextCell(2);
line->InsertCellPoint(63);
line->InsertCellPoint(51);
line->InsertNextCell(2);
line->InsertCellPoint(51);
line->InsertCellPoint(3);
vtkPolyData *poly=vtkPolyData::New();
poly->SetPoints(p);
poly->SetLines(line);
vtkStructuredGrid *grid=vtkStructuredGrid::New();
grid->SetPoints(p);
grid->GetPointData()->SetVectors(vectors);
vtkRungeKutta4 *integ=vtkRungeKutta4::New();
vtkStreamLine *streamer=vtkStreamLine::New();
streamer->SetInput(grid);
streamer->SetIntegrator(integ);
streamer->SetIntegrationStepLength(0.15);
streamer->SetMaximumPropagationTime(500);
streamer->SetNumberOfThreads(2);
streamer->SetStartPosition(5.0,0,0);
streamer->SetStepLength(2.5);
streamer->SetTerminalSpeed(0);
streamer->SetSpeedScalars(0);
streamer->SetVorticity(0);
vtkTubeFilter *streamTube=vtkTubeFilter::New();
streamTube->SetInput((vtkPolyData *) streamer->GetOutput());
streamTube->SetNumberOfSides(12);
streamTube->SetRadius(0.02);
streamTube->SetUseDefaultNormal(0);
vtkPolyDataMapper *pMap=vtkPolyDataMapper::New();
vtkPolyDataMapper *ppMap=vtkPolyDataMapper::New();
ppMap->SetInput(poly);
pMap->SetInput((vtkPolyData *) streamTube->GetOutput());
vtkActor *pActor=vtkActor::New();
pActor->SetMapper(pMap);
vtkActor *ppActor=vtkActor::New();
ppActor->SetMapper(ppMap);
ppActor->GetProperty()->SetColor(0.3800,0.7000,0.1600);
pActor->GetProperty()->SetColor(0.3800,0.7000,0.1600);
vtkSmartPointer<vtkRenderer>pRen=vtkRenderer::New();
pRen->AddActor(pActor);
pRen->AddActor(ppActor);
//pRen->AddActor(ppA);
vtkSmartPointer<vtkRenderWindow>pRenWin=vtkRenderWindow::New();
pRenWin->AddRenderer(pRen);
vtkRenderWindowInteractor *pIren=vtkRenderWindowInteractor::New();
pIren->SetRenderWindow(pRenWin);
pRen->SetBackground(1,1,1);
pRenWin->SetSize(300,300);
pRenWin->Render();
pRen->ResetCamera();
pIren->Initialize();
pIren->Start();
return 0;
}
我不明白哪里错了。如果有人能给我一些建议,我将不胜感激。
以下是我发现的一些东西:
streamer
的起始位置在grid
的域之外-
您可能需要致电
streamer->Update()
之前
streamTube->SetInput( streamer->GetOutput() )
以及类似的
streamTube->Update()
之前
pMap->SetInput( streamTube->GetOutput() )
请注意(在VTK6.3中,至少)
streamer->GetOutput()
和streamTube->GetOutput()
都返回vtkPolyData,因此不需要强制转换它 -
您可能需要设置
grid
的尺寸,即grid->SetDimensions(4, 4, 4);
-
考虑使用vtkOutlineFilter,而不是手动创建
poly
并将lines
添加到其中:vtkSmartPointer<vtkOutlineFilter> edges = vtkSmartPointer<vtkOutlineFilter>::New(); edges->SetInputData(grid); ppMap->SetInputConnection(edges->GetOutputPort());
-
如果您以后不删除对象,您可能希望在任何地方都使用vtkSmartPointers,例如:
vtkSmartPointer<vtkPoints> p = vtkSmartPointer<vtkPoints>::New(); vtkSmartPointer<vtkFloatArray> vectors = vtkSmartPointer<vtkFloatArray>::New(); vtkSmartPointer<vtkRungeKutta4> integ = vtkSmartPointer<vtkRungeKutta4>::New(); vtkSmartPointer<vtkStreamLine> streamer = vtkSmartPointer<vtkStreamLine>::New();
请参阅http://www.vtk.org/Wiki/VTK/Tutorials/SmartPointers了解更多信息。
相关文章:
- QuadTree只在窗口的右上角绘制
- 绘制旋转的三角形
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- SFML 文本未绘制在窗口上
- 如何在快板的屏幕中显示子位图的绘制?
- 如何绘制自定义形状的元素?
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 绘制文本问题
- 在 QT C++中绘制/操作多边形
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 在现代OpenGL中,绘制GL_TRIANGLE奇怪的z轴行为的填充圆
- OpenGL 着色器不绘制任何东西 - 糟糕的精灵类
- 要在屏幕上绘制一些小瓷砖,我应该使用 QQuickItem 还是 QQuickPaintedItem?