1. vtkWorldPointPicker简介
vtkWorldPointPicker是Visualization Toolkit(VTK)中的一个重要类,用于在三维场景中选择点并获取其世界坐标。在科学可视化、医学成像和工程建模等领域,它为用户提供了一个强大的工具,能够准确、快速地从渲染的三维模型中选取关键点位。
2. 类的位置和继承关系
vtkWorldPointPicker类属于VTK的选择器(Picker)类系列,继承自vtkAbstractPicker。它通过在屏幕空间内的坐标点与三维场景中的对象进行交互,实现从屏幕坐标到世界坐标的映射和选择功能。
using Kitware.VTK;
class Program
{
static void Main(string[] args)
{
// 创建一个VTK渲染窗口和渲染器
vtkRenderWindow renderWindow = new vtkRenderWindow();
vtkRenderer renderer = new vtkRenderer();
renderWindow.AddRenderer(renderer);
// 创建一个VTK交互器
vtkRenderWindowInteractor interactor = new vtkRenderWindowInteractor();
interactor.SetRenderWindow(renderWindow);
// 创建一个VTK球体作为示例对象
vtkSphereSource sphereSource = new vtkSphereSource();
sphereSource.Update();
vtkPolyDataMapper mapper = new vtkPolyDataMapper();
mapper.SetInputConnection(sphereSource.GetOutputPort());
vtkActor actor = new vtkActor();
actor.SetMapper(mapper);
renderer.AddActor(actor);
// 初始化vtkWorldPointPicker
vtkWorldPointPicker picker = new vtkWorldPointPicker();
// 将Picker设置给交互器
interactor.SetPicker(picker);
// 点击事件处理函数
interactor.LeftButtonPressEvt += (sender, e) =>
{
int[] pos = interactor.GetEventPosition();
picker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPos = picker.GetPickPosition();
}
3. 选择机制
vtkWorldPointPicker的选择机制基于鼠标交互,用户可以通过在渲染窗口中点击或拖动鼠标来选择点。Picker会根据鼠标位置在三维场景中进行射线投射,并计算出与场景中对象的交点,从而确定选取的世界坐标。
// 点击事件处理函数
interactor.LeftButtonPressEvt += (sender, e) =>
{
int[] pos = interactor.GetEventPosition();
picker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPos = picker.GetPickPosition();
Console.WriteLine($"Selected World Position: ({worldPos[0]}, {worldPos[1]}, {worldPos[2]})");
};
以上示例中,通过监听交互器的左键点击事件,在事件触发时使用vtkWorldPointPicker进行点选取,并将选择的世界坐标输出到控制台。
4. 返回的信息
一旦成功选取点位,vtkWorldPointPicker会返回该点的世界坐标,允许程序进一步处理或与其他模块进行交互。以下是如何获取选取的世界坐标并输出到控制台的示例:
// 点击事件处理函数
interactor.LeftButtonPressEvt += (sender, e) =>
{
int[] pos = interactor.GetEventPosition();
picker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPos = picker.GetPickPosition();
Console.WriteLine($"Selected World Position: ({worldPos[0]}, {worldPos[1]}, {worldPos[2]})");
};
在上述示例中,当用户通过左键点击交互器中的三维模型时,会调用vtkWorldPointPicker的Pick方法来获取选取点的世界坐标,并将其输出到控制台。
5. 选择的条件和参数
vtkWorldPointPicker的参数可以根据需要进行调整,主要包括选择的容差范围(tolerance)和点的大小(point size)。以下是如何设置和调整Picker的参数示例:
// 初始化vtkWorldPointPicker并设置参数
vtkWorldPointPicker picker = new vtkWorldPointPicker();
picker.SetTolerance(0.01); // 设置选择的容差范围为0.01
picker.SetPickRadius(5.0); // 设置点的大小为5.0
// 将Picker设置给交互器
interactor.SetPicker(picker);
在上述示例中,通过调用vtkWorldPointPicker的SetTolerance和SetPickRadius方法来设置选择的容差范围和点的大小,以便根据实际应用场景调整Picker的精度和表现。
6. 与屏幕空间选择器的比较
相较于基于屏幕空间的选择器(如vtkPropPicker),vtkWorldPointPicker在处理复杂的三维模型时表现更为稳定和精确。以下是比较两种选择器在不同情况下的效果示例:
// 使用vtkPropPicker进行基于屏幕空间的选择
vtkPropPicker propPicker = new vtkPropPicker();
propPicker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPosScreen = propPicker.GetPickPosition();
Console.WriteLine($"Selected World Position (Screen Picker): ({worldPosScreen[0]}, {worldPosScreen[1]}, {worldPosScreen[2]})");
// 使用vtkWorldPointPicker进行世界坐标的选择
picker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPosWorld = picker.GetPickPosition();
Console.WriteLine($"Selected World Position (World Picker): ({worldPosWorld[0]}, {worldPosWorld[1]}, {worldPosWorld[2]})");
在上述示例中,我们分别使用vtkPropPicker和vtkWorldPointPicker来获取屏幕空间和世界坐标中选取的点位,展示了两者在输出结果和适用场景上的不同之处。
7. 性能特征
vtkWorldPointPicker在性能方面表现出色,能够快速响应用户交互并返回准确的世界坐标。以下是如何评估和测试Picker的性能示例:
// 计算Picker的性能特征
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000; i++)
{
int[] pos = { 100, 100 }; // 模拟鼠标位置
picker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPos = picker.GetPickPosition();
}
stopwatch.Stop();
Console.WriteLine($"Time elapsed for 1000 picks: {stopwatch.ElapsedMilliseconds} ms");
在上述示例中,我们使用System.Diagnostics.Stopwatch来测试执行1000次选择操作所需的时间,以评估vtkWorldPointPicker的性能特征。
8. 应用场景
vtkWorldPointPicker广泛应用于科学研究、医学成像、工程建模等领域。以下是一个医学成像应用场景的示例:
// 医学成像应用场景示例
interactor.LeftButtonPressEvt += (sender, e) =>
{
int[] pos = interactor.GetEventPosition();
picker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPos = picker.GetPickPosition();
// 在医学图像中显示选择的世界坐标
MedicalImageProcessing.DisplayMarkerAtPosition(worldPos);
};
在上述示例中,当用户在医学图像中点击时,使用vtkWorldPointPicker获取选取的世界坐标,并将其传递给医学图像处理模块,以显示标记或执行进一步的分析。
9. 与其他vtk选择器的集成
vtkWorldPointPicker可以与其他VTK选择器(如vtkCellPicker)结合使用,以满足不同的需求。以下是如何结合使用不同选择器的示例:
// 结合使用vtkWorldPointPicker和vtkCellPicker的示例
vtkCellPicker cellPicker = new vtkCellPicker();
vtkPropPicker propPicker = new vtkPropPicker();
interactor.LeftButtonPressEvt += (sender, e) =>
{
int[] pos = interactor.GetEventPosition();
cellPicker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPosCell = cellPicker.GetPickPosition();
propPicker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPosProp = propPicker.GetPickPosition();
// 根据需要处理选取的世界坐标
ProcessPickedPositions(worldPosCell, worldPosProp);
};
在上述示例中,通过监听交互器的左键点击事件,分别使用vtkCellPicker和vtkPropPicker来获取不同选择器选取的世界坐标,并进行进一步的处理或比较。
10. 完整示例
下面是一个完整的C#示例代码,演示如何初始化和使用vtkWorldPointPicker进行点的选择和获取世界坐标:
using Kitware.VTK;
using System;
class Program
{
static void Main(string[] args)
{
// 创建一个VTK渲染窗口和渲染器
vtkRenderWindow renderWindow = new vtkRenderWindow();
vtkRenderer renderer = new vtkRenderer();
renderWindow.AddRenderer(renderer);
// 创建一个VTK交互器
vtkRenderWindowInteractor interactor = new vtkRenderWindowInteractor();
interactor.SetRenderWindow(renderWindow);
// 创建一个VTK球体作为示例对象
vtkSphereSource sphereSource = new vtkSphereSource();
sphereSource.Update();
vtkPolyDataMapper mapper = new vtkPolyDataMapper();
mapper.SetInputConnection(sphereSource.GetOutputPort());
vtkActor actor = new vtkActor();
actor.SetMapper(mapper);
renderer.AddActor(actor);
// 初始化vtkWorldPointPicker
vtkWorldPointPicker picker = new vtkWorldPointPicker();
// 将Picker设置给交互器
interactor.SetPicker(picker);
// 点击事件处理函数
interactor.LeftButtonPressEvt += (sender, e) =>
{
int[] pos = interactor.GetEventPosition();
picker.Pick(pos[0], pos[1], 0, renderer);
double[] worldPos = picker.GetPickPosition();
Console.WriteLine($"Selected World Position: ({worldPos[0]}, {worldPos[1]}, {worldPos[2]})");
};
// 启动交互器
interactor.Initialize();
renderWindow.Render();
interactor.Start();
}
}
以上示例代码创建了一个简单的VTK渲染窗口,其中包含一个球体作为示例对象。通过监听交互器的左键点击事件,使用vtkWorldPointPicker进行点的选择,并将选择的世界坐标输出到控制台。
总结
vtkWorldPointPicker是在VTK中用于三维场景点选取的重要工具,它通过在屏幕空间内的坐标点与三维场景中的对象进行交互,能够精确地计算并返回选取点的世界坐标。本文详细介绍了该类的功能、用法以及在科学可视化和工程应用中的实际应用场景。 vtkWorldPointPicker不仅在提高用户交互性和操作精度方面具有显著优势,而且在处理大型数据集和复杂场景时仍能保持高效率。它的应用不仅限于医学成像和科学研究,还涵盖了工程建模和虚拟现实等多个领域,为用户提供了强大而灵活的点选取解决方案。