You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:40:54