首页 > 其他分享 >VTK 视角的旋转、平移、缩放

VTK 视角的旋转、平移、缩放

时间:2023-05-22 17:11:33浏览次数:38  
标签:平移 Normal3DCameraStyle VTK 缩放 virtual vtkInteractorStyleTrackballCamera OnMouseW

在CAD/CAM软件中,都需要旋转、平移和缩放视角,来观察操作图形。由于VTK定义的交互的类型不是很适用,所有通过定义一套自己的交互方式。

在下面代码中,鼠标左键平移,滚轮缩放,右键旋转。

先定义一个交互类型。继承自vtkInteractorStyleTrackballCamera,并且交换按键。

class Normal3DCameraStyle : public vtkInteractorStyleTrackballCamera
{
public:
    static Normal3DCameraStyle* New();
    vtkTypeMacro(Normal3DCameraStyle, vtkInteractorStyleTrackballCamera);

    virtual void OnLeftButtonDown(void);
    virtual void OnLeftButtonUp(void);
    virtual void OnRightButtonDown(void);
    virtual void OnRightButtonUp(void);
    virtual void OnMiddleButtonDown(void);
    virtual void OnMiddleButtonUp(void);
    virtual void onm ouseWheelForward(void);
    virtual void onm ouseWheelBackward(void);
    virtual void onm ouseMove(void);
};

vtkStandardNewMacro(Normal3DCameraStyle);//必须加!!!!

void Normal3DCameraStyle::OnLeftButtonDown(void)
{
    vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
}

void Normal3DCameraStyle::OnLeftButtonUp(void)
{
    vtkInteractorStyleTrackballCamera::OnMiddleButtonUp();
}

void Normal3DCameraStyle::OnRightButtonDown(void)
{
    vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}

void Normal3DCameraStyle::OnRightButtonUp(void)
{
    vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
}

void Normal3DCameraStyle::OnMiddleButtonDown(void)
{
    
}

void Normal3DCameraStyle::OnMiddleButtonUp(void)
{
    
}

void Normal3DCameraStyle::OnMouseWheelForward(void)
{
    vtkInteractorStyleTrackballCamera::OnMouseWheelForward();
};

void Normal3DCameraStyle::OnMouseWheelBackward(void)
{
    vtkInteractorStyleTrackballCamera::OnMouseWheelBackward();
};

void Normal3DCameraStyle::OnMouseMove(void)
{
    vtkInteractorStyleTrackballCamera::OnMouseMove();
}  
  

添加Normal3DCameraStyle到交换器中

vtkNew<Normal3DCameraStyle> style;
ui.vtk_main->interactor()->SetInteractorStyle(style);

下面是完整代码

class Normal3DCameraStyle : public vtkInteractorStyleTrackballCamera
{
public:
    static Normal3DCameraStyle* New();
    vtkTypeMacro(Normal3DCameraStyle, vtkInteractorStyleTrackballCamera);

    virtual void OnLeftButtonDown(void);
    virtual void OnLeftButtonUp(void);
    virtual void OnRightButtonDown(void);
    virtual void OnRightButtonUp(void);
    virtual void OnMiddleButtonDown(void);
    virtual void OnMiddleButtonUp(void);
    virtual void onm ouseWheelForward(void);
    virtual void onm ouseWheelBackward(void);
    virtual void onm ouseMove(void);
};

vtkStandardNewMacro(Normal3DCameraStyle);//必须加!!!!

void Normal3DCameraStyle::OnLeftButtonDown(void)
{
    vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
}

void Normal3DCameraStyle::OnLeftButtonUp(void)
{
    vtkInteractorStyleTrackballCamera::OnMiddleButtonUp();
}

void Normal3DCameraStyle::OnRightButtonDown(void)
{
    vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}

void Normal3DCameraStyle::OnRightButtonUp(void)
{
    vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
}

void Normal3DCameraStyle::OnMiddleButtonDown(void)
{
    
}

void Normal3DCameraStyle::OnMiddleButtonUp(void)
{
    
}

void Normal3DCameraStyle::OnMouseWheelForward(void)
{
    vtkInteractorStyleTrackballCamera::OnMouseWheelForward();
};

void Normal3DCameraStyle::OnMouseWheelBackward(void)
{
    vtkInteractorStyleTrackballCamera::OnMouseWheelBackward();
};

void Normal3DCameraStyle::OnMouseMove(void)
{
    vtkInteractorStyleTrackballCamera::OnMouseMove();
}  
  

QtVtkTest::QtVtkTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

    vtkNew<vtkRenderer> renderer;
    vtkNew<vtkNamedColors> colors;

    //定义球
    vtkNew<vtkSphereSource> sphereSource;
    sphereSource->SetRadius(5);
    sphereSource->SetCenter(5, 0, 0);
    vtkNew<vtkPolyDataMapper> sphereMapper;
    sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
    vtkNew<vtkActor> sphereActor;
    sphereActor->SetMapper(sphereMapper);
    sphereActor->GetProperty()->SetColor(colors->GetColor4d("Green").GetData());
    sphereActor->GetProperty()->EdgeVisibilityOn(); //显示线框

    renderer->AddActor(sphereActor);

    renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());

    vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("RenderWindowNoUIFile");

    ui.vtk_main->setRenderWindow(renderWindow);
    //
    vtkNew<Normal3DCameraStyle> style;
    ui.vtk_main->interactor()->SetInteractorStyle(style);
}  

 

标签:平移,Normal3DCameraStyle,VTK,缩放,virtual,vtkInteractorStyleTrackballCamera,OnMouseW
From: https://www.cnblogs.com/SamFang/p/17421108.html

相关文章

  • VTK 设置面片背面颜色
    在上一篇文章切开了零件,发现零件内部和外部颜色一样,当需要不一样时,可以通过actor的SetBackfaceProperty方法设置背面属性。代码跟上一篇几乎一样,只是给actor设置了SetBackfaceProperty。//定义背面材质属性vtkNew<vtkProperty>backfaceProp;backfaceProp->SetDiffuseColor(0......
  • VTK 平面裁剪
    有些时候需要显示零件内部情况,所有会对零件显示进行平面裁剪,这里用到了vtkPlane和vtkClipPolyData。vtkPlane是定义一个平面,vtkClipPolyData使用vtkPlane定义的平面进行裁剪。下面列出主要的代码,其他Qt框架代码参考前面文章。QSurfaceFormat::setDefaultFormat(QVTKOpenGLNati......
  • VTK 显示3D网格线
    在VTK9.1.0在Windows10+VS2019+Qt5.15.2环境下编译安装的Qt例子中,想显示球体表面的网格线。通过vtkExtractEdges来实现显示全部网格线QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());vtkNew<vtkRenderer>renderer;vtkNew<vtkNam......
  • VTK 9.2 Qt 5.14 安装及错误处理
    参考VTK9.1.0在Windows10+VS2019+Qt5.15.2环境下编译安装以及VTK应用于QT_vtk-qt安装包_isongxw的博客-CSDN博客安装注意:编译release和debug,通过切换配置为release和debug,文件都是在cmake的CMAKE_INSTALL_PREFIX指定的文件夹,需要编译完一种后,把这个文件夹改名(比如debug配置,则改......
  • js计算一个矩形内部,有一个等比缩放的矩形,如何判断宽和高那个先溢出外层的矩形
    最近在做jscanvas绘图需求时,遇到一个矩形图形重叠逻辑判断问题。一个任意矩形内部,有一个任意等比缩放的矩形,如何判断宽和高那个先溢出外层的矩形?宽和高那个先贴到边上?可以根据两个矩形的比例关系来判断宽和高那个先溢出。首先计算出两个矩形的宽高比,然后比较它们的大小关系。......
  • js计算一个矩形内部,有一个等比缩放的矩形,如何判断宽和高那个先溢出外层的矩形
    最近在做jscanvas绘图需求时,遇到一个矩形图形重叠逻辑判断问题。一个任意矩形内部,有一个任意等比缩放的矩形,如何判断宽和高那个先溢出外层的矩形?宽和高那个先贴到边上?可以根据两个矩形的比例关系来判断宽和高那个先溢出。首先计算出两个矩形的宽高比,然后比较它们的大小关系。......
  • vue在手机端页面缩放的控制
    1,问题的提出某vue前端程序,在手机APP上运行。需要做多图片浏览效果,要求如下:进入浏览页面时,显示适应手机页面的缩小图,用户可采用双指缩放,放大查看小图用户点击图片时,弹出大图,宽度尺寸固定为1200px大图可移动查看,但不允许缩放,点击大图后退出以上要求中,第2和3叠加后,可能造成显......
  • html css 等比例缩放
    来自:https://blog.csdn.net/chenrui310/article/details/129365208侵删letcw=1920,ch=1080//默认letbody=document.getElementById('body')body.style.width=`${cw}px`body.style.height=`${ch}px`//对bo......
  • Halcon模板匹配之形状匹配,缩放比匹配,相关性匹配
     是什么是模板匹配?模板就是一副已知的小图像,而模板匹配就是在一副大图像中搜寻目标,已知该图中有要找的目标,且该目标同模板有相同的尺寸、方向和图像元素,通过一定的算法可以在图中找到目标,确定其坐标位置 模板匹配的参数介绍:1.图像金字塔:Numberlever2.起始角度:AngleStart......
  • 特征缩放/归一化
         ......