VTK 光源 Transform 自定义BoundingBox绘制

在这里插入图片描述
这段代码展示了如何在 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 中创建光源,并将其添加到场景中以及如何为光源创建可视化表示。同时还展示了如何创建和显示一个表示光源包围框的几何图形,以及如何在场景中添加其他几何对象(如球体)。这些步骤一起构成了一个完整的光照效果和几何可视化的流程。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磊磊cpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值