0

我可以在 vtk.js 中将我自己的法线设置为 polydata(行),它工作正常。但是当我尝试使用带有所述多数据的 TubeFilter 时,它不起作用;如果我不设置法线,我只能生成管子。调用后程序不运行任何代码tubeFilter.update()

我这样创建法线:

  const numSegments  = 1;
  const normals = new Float32Array(3 * (numSegments + 1));
  const normalArray = vtkDataArray.newInstance({
    name: 'Normals',
    values: normals,
    numberOfComponents: 3,
  });

  for(let i=0; i<numSegments + 1; i++) {
    normals[i*3+0] = 0;
    normals[i*3+1] = 0;
    normals[i*3+2] = 1;
  }

并将其设置为 polydata,如下所示:

polyData.getPointData().setNormals(normalArray);

我这样创建管式过滤器:

const tubeFilter = vtkTubeFilter.newInstance();
tubeFilter.setCapping(false);
tubeFilter.setNumberOfSides(50);
tubeFilter.setRadius(0.1);
tubeFilter.setInputData(polyData);
tubeFilter.setInputArrayToProcess(0, 'Scalars', 'PointData', 'Scalars');
tubeFilter.update(); // Program stops here

为什么它不起作用?我究竟做错了什么?我该怎么做才能用我自己的法线生成管子?这是完整的代码:index.js ; 这是此示例的简化版本。

这是在没有设置法线时生成的管子线的图像(左),只有在设置法线时生成的线(右),因为代码在尝试生成管子后停止。

4

1 回答 1

1

您可以使用类SetDefaultNormal的功能vtkTubeFilter。只需像这样使用它并忽略创建矢量法线,然后将它们放入行中:

const tubeFilter = vtkTubeFilter.newInstance();
tubeFilter.setCapping(false);
tubeFilter.setNumberOfSides(50);
tubeFilter.setRadius(0.1);
tubeFilter.setInputData(polyData);
tubeFilter.useDefaultNormalOn();
tubeFilter.setDefaultNormal(0,0,1);
tubeFilter.setInputArrayToProcess(0, 'Scalars', 'PointData', 'Scalars');
tubeFilter.update(); // Program stops here
于 2019-11-09T17:39:41.140 回答