识别鼠标选中actor_vtkInteractorStyleTrackballActor

人生乱弹 2年前 (2023) admin
10 0

开发环境:
Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码目的:学习与总结

demo解决问题:通过自定义vtkInteractorStyle类中成员函数OnLeftButtonDown,判断鼠标当前选中的是哪个actor;同理可自定义鼠标右键、滚轮、键盘等事件
关键类:vtkInteractorStyleTrackballActor允许用户与场景中彼此独立的对象进行交互(旋转、平移等);根据实际应用场景有如下常见替换对象:

vtkInteractorStyleTrackballActor作用对象:actor; 形式:TrackballvtkInteractorStyleTrackballCamera作用对象:Camera; 形式:TrackballvtkInteractorStyleJoystickActor作用对象:actor; 形式:JoystickvtkInteractorStyleJoystickCamera作用对象:Camera; 形式:JoystickvtkInteractorStyleImage作用对象:vtkImageActor; 形式:绑定使相机的视图平面垂直于x-y平面……
参考:vtkInteractorStyle详细介绍

#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCubeSource.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>

namespace {

// Handle mouse events.
class MouseInteractorStyle5 : public vtkInteractorStyleTrackballActor
{
public:
static MouseInteractorStyle5* New();
vtkTypeMacro(MouseInteractorStyle5, vtkInteractorStyleTrackballActor);

virtual void OnLeftButtonDown() override
{
// Forward events.
vtkInteractorStyleTrackballActor::OnLeftButtonDown();

if (this->InteractionProp == this->Cube)
{
std::cout << "Picked cube." << std::endl;
}
else if (this->InteractionProp == this->Sphere)
{
std::cout << "Picked sphere." << std::endl;
}
}

vtkActor* Cube;
vtkActor* Sphere;
};

vtkStandardNewMacro(MouseInteractorStyle5);

} // namespace

int main(int, char*[])
{
vtkNew<vtkNamedColors> colors;

// Create a cube.
vtkNew<vtkCubeSource> cubeSource;
cubeSource->Update();

vtkNew<vtkPolyDataMapper> cubeMapper;
cubeMapper->SetInputConnection(cubeSource->GetOutputPort());

vtkNew<vtkActor> cubeActor;
cubeActor->SetMapper(cubeMapper);
cubeActor->GetProperty()->SetColor(colors->GetColor3d("MistyRose").GetData());

// Create a sphere.
vtkNew<vtkSphereSource> sphereSource;
sphereSource->SetCenter(2, 0, 0);
sphereSource->Update();

// Create a mapper.
vtkNew<vtkPolyDataMapper> sphereMapper;
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());

// Create an actor.
vtkNew<vtkActor> sphereActor;
sphereActor->SetMapper(sphereMapper);
sphereActor->GetProperty()->SetColor(
colors->GetColor3d("LightGoldenrodYellow").GetData());

// A renderer and render window.
vtkNew<vtkRenderer> renderer;
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer);
renderWindow->SetWindowName("SelectAnActor");

// An interactor.
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetRenderWindow(renderWindow);

// Set the custom stype to use for interaction.
vtkNew<MouseInteractorStyle5> style;
style->SetDefaultRenderer(renderer);
style->Cube = cubeActor;
style->Sphere = sphereActor;

renderWindowInteractor->SetInteractorStyle(style);

renderer->AddActor(cubeActor);
renderer->AddActor(sphereActor);
renderer->SetBackground(colors->GetColor3d("SlateGray").GetData());
renderer->ResetCamera();
renderer->GetActiveCamera()->Zoom(0.9);

// Render and interact.
renderWindow->Render();
renderWindowInteractor->Initialize();
renderWindowInteractor->Start();

return EXIT_SUCCESS;
}

文章来源

版权声明:admin 发表于 2023年11月1日 pm2:32。
转载请注明:识别鼠标选中actor_vtkInteractorStyleTrackballActor | 银库

相关文章

本站主题由 OneNav 一为主题强力驱动