VTK用鼠标画线+VTK坐标转换问题+实例

您所在的位置:网站首页 鼠标在屏幕上划线 VTK用鼠标画线+VTK坐标转换问题+实例

VTK用鼠标画线+VTK坐标转换问题+实例

2024-07-10 03:55| 来源: 网络整理| 查看: 265

本人在用VTK实现在渲染窗口上用鼠标画线的探究过程。

要在窗口上用鼠标画线首先要做的就是重写鼠标交互事件,于是就在官方网站找到重写鼠标响应事件的demo,然后再更改官方的demo,实现自己需要的功能。我的想法是:

1.获取鼠标左键按下时的坐标。

2.获取鼠标左键上弹时的坐标。

3.用这两个点连接一条线。

遇到的问题时,智能获取到相对于窗口的坐标点,而不是世界相对世界坐标的坐标点。导致的结果就是画线的位置并不是鼠标左键按下和上弹的连线。

在VS下实现的代码如下(没有用cmake管理,直接在vs下做的):

包含一些我在实现的过程中调试的过程,已经注释:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INIT(vtkInteractionStyle); // Define interaction style vtkSmartPointer renderer; double point1[3]{ 0 }; double point2[3]{ 0 }; double WorldPoint[3]{ 0 }; double WorldPoint1[3]{ 0 }; int *clickPos; int *clickPos1; class customMouseInteractorStyle : public vtkInteractorStyleTrackballCamera { public: static customMouseInteractorStyle* New(); vtkTypeMacro(customMouseInteractorStyle, vtkInteractorStyleTrackballCamera); virtual void OnLeftButtonDown() { std::cout GetEventPosition(); clickPos = this->GetInteractor()->GetEventPosition(); point1[0] = clickPos[0]; point1[1] = clickPos[1]; renderer->SetDisplayPoint(point1[0], point1[1], 0); renderer->DisplayToWorld(); WorldPoint[0] = (renderer->GetWorldPoint())[0]; WorldPoint[1] = (renderer->GetWorldPoint())[1]; WorldPoint[2] = (renderer->GetWorldPoint())[2]; // double* worldPosition = picker->GetPickPosition(); // std::cout GetCellType(), polyline->GetPointIds()); //grid->SetPoints(points); //vtkSmartPointermapper= vtkSmartPointer::New(); //mapper->SetInputData(grid); //vtkSmartPointer actor1 = vtkSmartPointer::New(); //actor1->SetMapper(mapper); //actor1->GetProperty()->SetColor(1.0, 0.0, 0.0); //设置颜色 // //renderer->AddActor(actor1); // //renderer->GetRenderWindow()->GetInteractor()->Initialize(); //renderer->GetRenderWindow()->GetInteractor()->Render(); // renderer->GetRenderWindow()->Start(); the second way // double* p = renderer->GetActors()->GetLastActor()->GetOrigin(); vtkSmartPointer lineSource = vtkSmartPointer::New(); lineSource->SetPoint1(WorldPoint); lineSource->SetPoint2(WorldPoint1); vtkSmartPointer mapper = vtkSmartPointer::New(); mapper->SetInputConnection(lineSource->GetOutputPort()); vtkSmartPointer actor1 = vtkSmartPointer::New(); actor1->SetMapper(mapper); actor1->GetProperty()->SetColor(1.0, 0.0, 0.0); // actor1->SetOrigin(0, 0,0); this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor1); renderer->GetRenderWindow()->GetInteractor()->Initialize(); renderer->GetRenderWindow()->GetInteractor()->Render(); // vtkSmartPointerlines = vtkSmartPointer::New(); lines->InsertNextCell(2); // lines->InsertNextCell(2, pts); // vtkSmartPointerpolydata = vtkSmartPointer::New(); // polydata->SetPoints(points); // polydata->SetPolys(lines); // vtkSmartPointerlinemapper = vtkSmartPointer::New(); // linemapper->SetInputData(polydata); //测试划线 // vtkSmartPointerlinepro = vtkSmartPointer::New(); // // linepro->SetColor(0, 0, 0); // linepro->SetOpacity(1); //透明度 // vtkSmartPointerlineact = vtkSmartPointer::New(); // lineact->SetMapper(linemapper); // lineact->SetProperty(linepro); // // renderer->AddActor(lineact); // renderer->GetRenderWindow()->Start(); /*vtkSmartPointerrender = vtkSmartPointer::New(); render->AddActor(lineact); vtkSmartPointerrenwin = vtkSmartPointer::New(); renwin->AddRenderer(render); vtkSmartPointeriren = vtkSmartPointer::New(); iren->SetRenderWindow(renwin); iren->Initialize(); iren->Start();*/ // renderer->Render(); } virtual void OnMiddleButtonDown() { std::cout SetInputConnection(sphereSource->GetOutputPort()); vtkSmartPointer actor = vtkSmartPointer::New(); actor->SetMapper(mapper); vtkSmartPointer colors = vtkSmartPointer::New(); renderer = vtkSmartPointer::New(); renderer->SetBackground(colors->GetColor3d("Slate_grey").GetData()); renderer->AddActor(actor); vtkSmartPointer renderWindow = vtkSmartPointer::New(); renderWindow->AddRenderer(renderer); vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New(); renderWindowInteractor->SetRenderWindow(renderWindow); vtkSmartPointer style = vtkSmartPointer::New(); renderWindowInteractor->SetInteractorStyle(style); renderWindowInteractor->Initialize(); renderWindowInteractor->Start(); return EXIT_SUCCESS; }

结果如下:

关于坐标系的理论就不说了,大家都有买书,书上都有示意图,只是书上可能没有这样的实例。

参考:

VTK官网上鼠标事件自定义:https://lorensen.github.io/VTKExamples/site/Cxx/Interaction/MouseEvents/

坐标转换问题参考了:http://tieba.baidu.com/p/4873446950

这个bug搞了两天,希望可以帮到遇到同样问题的人,节约时间,少走一点弯路。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3