VTK中是否有过滤器可生成含3个无符号字符分量的恒定标量场?
VTK生成多分量无符号字符恒定标量场问题解决
问题背景
需要在VTK管线中生成带有3个无符号字符分量(颜色)的恒定标量场,且无法从头创建vtkPolyData。尝试使用vtkArrayCalculator(Java封装)实现,但输出为VECTORS数据,实际需要SCALARS数据,测试代码如下:
var cubeSource = new vtkCubeSource(); var calc = new vtkArrayCalculator(); calc.SetInputConnection(cubeSource.GetOutputPort()); calc.SetFunction("255 * jHat"); calc.SetResultArrayType(3); // VTK_UNSIGNED_CHAR calc.SetAttributeTypeToCellData();
可行解决方案
方案1:转换vtkArrayCalculator的向量输出为标量
vtkArrayCalculator仅能生成向量/张量类型结果,无法直接输出多分量标量。可以在计算完成后,修改输出数组的属性标记,将其从VECTORS转为SCALARS:
var cubeSource = new vtkCubeSource(); cubeSource.Update(); var calc = new vtkArrayCalculator(); calc.SetInputConnection(cubeSource.GetOutputPort()); calc.SetFunction("255 * jHat"); calc.SetResultArrayType(3); // VTK_UNSIGNED_CHAR calc.SetAttributeTypeToCellData(); calc.Update(); // 获取输出数据集与计算结果数组 vtkPolyData output = (vtkPolyData)calc.GetOutput(); String resultName = calc.GetResultArrayName(); vtkDataArray resultArray = output.GetCellData().GetVectors(resultName); // 移除原VECTORS属性,重新以SCALARS添加 output.GetCellData().RemoveArray(resultName); output.GetCellData().SetScalars(resultArray);
方案2:使用vtkProgrammableFilter直接生成标量数组
如果需要更规范的方式,可通过vtkProgrammableFilter直接创建并添加多分量无符号字符标量数组,逻辑更直观:
var cubeSource = new vtkCubeSource(); cubeSource.Update(); var programmableFilter = new vtkProgrammableFilter(); programmableFilter.SetInputConnection(cubeSource.GetOutputPort()); programmableFilter.SetExecuteMethod(() -> { vtkPolyData input = (vtkPolyData)programmableFilter.GetInput(); vtkPolyData output = (vtkPolyData)programmableFilter.GetOutput(); output.ShallowCopy(input); int cellCount = input.GetNumberOfCells(); // 创建3分量无符号字符数组 vtkUnsignedCharArray scalarArray = new vtkUnsignedCharArray(); scalarArray.SetNumberOfComponents(3); scalarArray.SetNumberOfTuples(cellCount); scalarArray.SetName("ConstantColor"); // 设置恒定颜色值(示例为(0,255,0)) for (int i = 0; i < cellCount; i++) { scalarArray.SetTuple3(i, 0, 255, 0); } // 将数组设置为CellData的SCALARS output.GetCellData().SetScalars(scalarArray); scalarArray.Delete(); }); programmableFilter.Update();
关键提示
- VTK中多分量标量与向量的存储结构类似,但属性标记不同,SCALARS会被渲染管线识别为颜色数据,而VECTORS则作为向量数据处理。
- 若需要针对PointData生成标量,只需将代码中的
GetCellData()替换为GetPointData()即可。
内容的提问来源于stack exchange,提问作者Thibaud
相关产品推荐
相关产品推荐

