在C#中通过引用vtk的.net版本,也就是ActiViz.net,可以实现桌面三维应用程序开发,比如下面这个博主开发的类似谷歌地球的小应用。在此开发过程中,遇到了各种各样的问题,现在分享给大家。
X3DDemo
后面的博客里,博主会上传源代码,请持续关注本人的博客!!
一个最简单的方法就是在vtkActor这个层次,一次性给这个actor里所有对象(包括顶点、线和面)附上颜色
vtkActor actor = vtkActor.New();
actor.GetProperty().SetColor(color.R / 255.0, color.G / 255.0, color.B / 255.0);
其中color就是C#的Color对象,它的RGB都是0~255的数字,需要除以255转成0~1的数字
上述方法有个小问题,就是所有对象都变成一样颜色了。但如果说我们希望不同的节点需要采用不同的颜色,那么就需要在polydata这个层次附上颜色了
// 创建点云数据
vtkPoints points = vtkPoints.New();
vtkCellArray vertices = vtkCellArray.New();
// 定义点云数据和颜色
double[][] pointData = new double[][]
{
new double[] { 0.0, 0.0, 0.0 },
new double[] { 1.0, 0.0, 0.0 },
new double[] { 0.0, 1.0, 0.0 },
new double[] { 0.0, 0.0, 1.0 }
};
byte[][] colors = new byte[][]
{
new byte[] { 255, 0, 0 }, // 红色
new byte[] { 0, 255, 0 }, // 绿色
new byte[] { 0, 0, 255 }, // 蓝色
new byte[] { 255, 255, 0 } // 黄色
};
for (int i = 0; i < pointData.Length; i++)
{
int pointId = points.InsertNextPoint(pointData[i]);
vertices.InsertNextCell(1);
vertices.InsertCellPoint(pointId);
}
// 创建 vtkPolyData
vtkPolyData polyData = vtkPolyData.New();
polyData.SetPoints(points);
polyData.SetVerts(vertices);
// 创建颜色数组
vtkUnsignedCharArray colorArray = vtkUnsignedCharArray.New();
colorArray.SetNumberOfComponents(3); // RGB
colorArray.SetName("Colors");
foreach (var color in colors)
{
colorArray.InsertNextTypedTuple(color);
}
// 将颜色数组添加到点数据中
polyData.GetPointData().SetScalars(colorArray);
// 创建映射器和演员
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputData(polyData);
vtkActor actor = vtkActor.New();
actor.SetMapper(mapper);
actor.GetProperty().SetPointSize(10); // 设置点的大小
这里面关键的对象就是vtkUnsignedCharArray类的这个colorArray变量,它其实就是给每个点一个有三个char构成的标量,然后用polyData.GetPointData().SetScalars(colorArray); 把它应用上。
这里有一点要注意的是,有多少个点,在colorArray里就要给多少元素。
上述这个例子就是在一个actor里包含了四种颜色的四个点。