修复了世界坐标系坐标拾取错误

pull/1/head
剑古敛锋 2024-07-23 10:29:49 +08:00
parent c3a47c2789
commit 49781f86a8
4 changed files with 49 additions and 14 deletions

View File

@ -65,12 +65,14 @@
#include <vtkExtractSelectedPolyDataIds.h>
#include <vtkConnectivityFilter.h>
#include "Common/DebugLogger.h"
#include <vtkWorldPointPicker.h>
namespace ModuleBase
{
PropPickerInteractionStyle::PropPickerInteractionStyle()
{
_worldPointPicker=vtkSmartPointer<vtkWorldPointPicker>::New();
_picked=new double[3];
_actor = nullptr;
_property = vtkProperty::New();
// _selectItemIDs = vtkSmartPointer<vtkIdTypeArray>::New();
@ -92,6 +94,12 @@ namespace ModuleBase
delete _dataProp;
_property->Delete();
_coordinate->Delete();
if(nullptr!=_picked){
delete[] _picked;
_picked=nullptr;
}
}
/*
@ -287,6 +295,18 @@ namespace ModuleBase
*/
void PropPickerInteractionStyle::OnMouseMove()
{
// 获取坐标系
_worldPointPicker->Pick(this->Interactor->GetEventPosition()[0],
this->Interactor->GetEventPosition()[1],
0, // always zero.
this->Interactor->GetRenderWindow()
->GetRenderers()
->GetFirstRenderer());
_worldPointPicker->GetPickPosition(_picked);
emit MouseMoveInWorldPoint(_picked[0],_picked[1],_picked[2]);
_mouseMoved = true;
vtkInteractorStyleRubberBandPick::OnMouseMove();
if ((_selectModel == BoxMeshCell) || (_selectModel == BoxMeshNode) || (_selectModel == DrawSketch) /*&& _leftButtonDown*/)

View File

@ -34,6 +34,7 @@
#include <vtkUnstructuredGrid.h>
#include <vtkVertexGlyphFilter.h>
#include <vtkIdFilter.h>
#include <vtkWorldPointPicker.h>
class vtkActor;
class vtkProperty;
@ -97,7 +98,7 @@ namespace ModuleBase
void mouseWhellMove();
void rightDownMenu();
void clearAllHighLight();
void MouseMoveInWorldPoint(double x,double y,double z);
private:
virtual void OnLeftButtonDown() override;
virtual void OnLeftButtonUp() override;
@ -154,8 +155,8 @@ namespace ModuleBase
bool _selected{false};
vtkActor *_preGeoSeltctActor{};
vtkCoordinate *_coordinate{};
double* _picked;
vtkSmartPointer<vtkWorldPointPicker> _worldPointPicker;
// QList<vtkActor*> _tempActorContainer{};

View File

@ -54,6 +54,7 @@
#include "MeshData/meshSingleton.h"
#include "PreWindowInteractorStyle.h"
#include <vtkVersionMacros.h>
#include <vtkWorldPointPicker.h>
namespace ModuleBase
{
@ -118,6 +119,11 @@ namespace ModuleBase
_cubeAxesActor = vtkSmartPointer<vtkCubeAxesActor>::New();
//createCubeAxes();
// // 世界坐标轴
_worldPointPicker=vtkSmartPointer<vtkWorldPointPicker>::New();
_interactor->SetPicker(_worldPointPicker);
if (_graphWindowType == PreWindows)
{
PropPickerInteractionStyle *style = PropPickerInteractionStyle::New();
@ -125,11 +131,15 @@ namespace ModuleBase
style->SetDefaultRenderer(_render);
style->setRender(_render);
style->setRenderWindow(_renderWindow);
_interactor->SetInteractorStyle(style);
vtkSmartPointer<vtkAreaPicker> areaPicker = vtkSmartPointer<vtkAreaPicker>::New(); // 面积拾取器
_interactor->SetPicker(areaPicker);
_interactionStyle = style;
//
//关联信号
// connect(style, SIGNAL(selectGeometry(bool)), this, SIGNAL(selectGeometry(bool)));
connect(style, SIGNAL(selectGeometry(bool, vtkActor *, int)), this, SIGNAL(selectGeometry(bool, vtkActor *, int)));
@ -145,7 +155,8 @@ namespace ModuleBase
connect(style, SIGNAL(mouseWhellMove()), this, SLOT(mouseWheelMove()));
connect(style, SIGNAL(rightDownMenu()), this, SIGNAL(rightDownMenuSig()));
// pointcloud
// 世界坐标系
connect(style, SIGNAL(MouseMoveInWorldPoint(double ,double ,double )),this, SIGNAL(WorldPointMouseMove(double ,double ,double )));
}
@ -551,14 +562,14 @@ namespace ModuleBase
}
void Graph3DWindow::mouseMoveEvent(QMouseEvent* event)
{
// 获取鼠标当前位置
QPointF pos=event->pos();
double dispCoord[2] = {pos.x(), pos.y()};
vtkSmartPointer<vtkCoordinate> pCoorPress = vtkSmartPointer<vtkCoordinate>::New();
pCoorPress->SetCoordinateSystemToDisplay();
pCoorPress->SetValue(dispCoord);
double *worldCoord = pCoorPress->GetComputedWorldValue(_render);
// qDebug() << worldCoord[0] << worldCoord[1] << worldCoord[2];
emit this->WorldPointMouseMove(worldCoord[0],worldCoord[1],worldCoord[2]);
// // 获取鼠标当前位置
// QPointF pos=event->pos();
// double dispCoord[2] = {pos.x(), pos.y()};
// vtkSmartPointer<vtkCoordinate> pCoorPress = vtkSmartPointer<vtkCoordinate>::New();
// pCoorPress->SetCoordinateSystemToDisplay();
// pCoorPress->SetValue(dispCoord);
// double *worldCoord = pCoorPress->GetComputedWorldValue(_render);
//// qDebug() << worldCoord[0] << worldCoord[1] << worldCoord[2];
// emit this->WorldPointMouseMove(worldCoord[0],worldCoord[1],worldCoord[2]);
}
}

View File

@ -91,6 +91,7 @@
// Boost
#include <boost/math/special_functions/round.hpp>
#include <vtkCubeAxesActor.h>
#include <vtkWorldPointPicker.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
@ -245,6 +246,8 @@ namespace ModuleBase
PropPickerInteractionStyle* _interactionStyle{};
SelectModel _selectModel{ None };
// 世界坐标系
vtkSmartPointer<vtkWorldPointPicker> _worldPointPicker;
/*** 点云处理***/
pcl::visualization::PCLVisualizer::Ptr _viewer; // 点云显示共享指针