这段代码展示了如何在 VTK 中创建光源,并在场景中添加光源的可视化表示。以下是关于代码的详细解释和教程:
创建光源
vtkSmartPointer<vtkLight> light = vtkSmartPointer<vtkLight>::New();
使用 vtkSmartPointer
创建了一个智能指针,用于管理光源对象。
设置光源属性
light->SetPosition(2, 0.0, 0.0);
light->SetPositional(true);
light->SetLightTypeToSceneLight();
light->SetFocalPoint(0, 0, 0);
light->SetConeAngle(10);
light->SetDiffuseColor(colors->GetColor3d("Red").GetData());
light->SetAmbientColor(colors->GetColor3d("Green").GetData());
light->SetSpecularColor(colors->GetColor3d("Blue").GetData());
设置了光源的位置、类型、聚光角度以及颜色属性。
将光源添加到渲染器中
renderer->AddLight(light);
将光源添加到渲染器中,以便在渲染场景时考虑光照效果。
创建光源的可视化表示
vtkNew<vtkLightActor> lightActor;
lightActor->SetLight(light);
renderer->AddViewProp(lightActor);
创建了一个光源的可视化表示,并将其添加到渲染器中。这样可以在场景中看到光源的位置和方向。
创建光源的包围框
// 创建包围框
vtkBoundingBox boundingBox{ boundsData };
// 提取包围框的顶点
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
double bounds[6];
boundingBox.GetBounds(bounds);
for (int i = 0; i < 8; ++i) {
double x = (i & 1) ? bounds[1] : bounds[0];
double y = (i & 2) ? bounds[3] : bounds[2];
double z = (i & 4) ? bounds[5] : bounds[4];
points->InsertNextPoint(x, y, z);
}
这段代码创建了光源的包围框,并提取了其顶点坐标。
创建包围框的几何表示
// 创建线段
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
vtkIdType vertices[12][2] = {
{0, 2}, {3, 2}, {1, 3}, {4, 5},
{4, 6}, {5, 7}, {7, 6}, {1, 5},
{4, 0}, {2, 6}, {7, 3}, {0, 1}
};
for (int i = 0; i < 12; ++i) {
vtkIdType line[2];
line[0] = vertices[i][0];
line[1] = vertices[i][1];
lines->InsertNextCell(2, line);
}
这段代码创建了表示包围框的线段,并定义了每条线段的端点。
创建几何数据集
// 创建 VTK 数据集
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(points);
polydata->SetLines(lines);
使用顶点坐标和线段信息创建了一个 VTK 的 PolyData 数据集。
创建数据映射器和演员
// 创建 VTK 数据映射器
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polydata);
// 创建 VTK actor
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
创建了一个数据映射器和一个演员,将数据集映射到渲染场景中。
添加演员到渲染器中
renderer->AddActor(actor);
将演员添加到渲染器中,使得包围框的几何表示能够在渲染场景中显示出来。
创建球体并添加到场景中
// 创建球体
vtkNew<vtkSphereSource> sphereSource;
sphereSource->SetCenter(3, 0, 0);
sphereSource->SetRadius(0.1);
// 创建球体的 Mapper 和 Actor
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkNew<vtkActor> actor;
actor->SetMapper(mapper);
// 将球体 Actor 添加到渲染器中
renderer->AddActor(actor);
这段代码创建了一个球体,并将其添加到渲染器中,使得球体能够在渲染场景中显示出来。
教程总结
这段代码演示了如何在 VTK 中创建光源,并将其添加到场景中以及如何为光源创建可视化表示。同时还展示了如何创建和显示一个表示光源包围框的几何图形,以及如何在场景中添加其他几何对象(如球体)。这些步骤一起构成了一个完整的光照效果和几何可视化的流程。