VTK ( 004) 基础 坐标轴

VTK ( 004) 基础 坐标轴

主要是 QVTKOpenGLNativeWidget 添加坐标轴, vtkOrientationMarkerWidgetSetInteractor 方法中要 vtkNew<vtkGenericOpenGLRenderWindow> renwindow,然后 renwindow->GetInteractor();

添加坐标轴

vtkSmartPointer<vtkAxesActor> actorAxes=
    vtkSmartPointer<vtkAxesActor>::New();
actorAxes->SetPosition(0, 0, 0);         // 设置坐标轴的位置
actorAxes->SetTotalLength(10, 10, 10);   // 设置坐标轴的总长度
actorAxes->SetShaftType(0);              // 设置轴的类型
actorAxes->SetAxisLabels(0);             // 设置是否显示轴标签
actorAxes->SetCylinderRadius(0.02);      // 设置轴的圆柱半径

坐标轴小部件

完整例子 1(vtkRenderWindow)


#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkAxesActor.h>
#include <vtkOrientationMarkerWidget.h>

int main(int argc, char *argv[])
{
    // 创建一个渲染器
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();

    // 创建一个渲染窗口
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    // 创建一个渲染窗口交互器
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    // 创建一个坐标轴演员
    vtkSmartPointer<vtkAxesActor> iconActor = vtkSmartPointer<vtkAxesActor>::New();
    iconActor->SetTotalLength(1.0, 1.0, 1.0); // 设置轴的长度
    iconActor->SetShaftType(0); // 设置轴的类型为直线
    iconActor->SetAxisLabels(1); // 显示轴标签
    iconActor->SetCylinderRadius(0.02); // 设置轴的圆柱半径

    // 创建一个方向标小部件
    vtkSmartPointer<vtkOrientationMarkerWidget> orientationWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
    orientationWidget->SetOutlineColor(0.9300, 0.5700, 0.1300); // 设置轮廓颜色
    orientationWidget->SetInteractor(interactor); // 设置交互器
    orientationWidget->SetOrientationMarker(iconActor); // 设置方向标演员
    orientationWidget->SetViewport(0.0, 0.0, 0.1, 0.1); // 设置方向标的位置和大小
    orientationWidget->SetEnabled(1); // 启用方向标小部件
    orientationWidget->InteractiveOn(); // 开启交互模式

    // 设置背景颜色
    renderer->SetBackground(0.1, 0.2, 0.3); // 深蓝色背景

    // 初始化渲染窗口交互器
    renderWindow->Render();
    interactor->Initialize();

    // 开始交互
    interactor->Start();

    return EXIT_SUCCESS;
}

完整例子 2(QVTKOpenGLNativeWidget)


/**
 * 下面两个在头文件中已经声明
 * QVTKOpenGLNativeWidget *m_qvtkWidget = nullptr;
 * vtkSmartPointer<vtkOrientationMarkerWidget> MarkerWidget = nullptr;
 */

m_qvtkWidget = new QVTKOpenGLNativeWidget();
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); // 在构造函数中进行初始化
// 显示
vtkNew<vtkGenericOpenGLRenderWindow> renwindow;
renwindow->AddRenderer(renderer);
m_qvtkWidget->setRenderWindow(renwindow.Get());
// 添加到 ui中
ui->verticalLayout->addWidget(m_qvtkWidget, 1);

// 显示坐标系的vtk组件
vtkSmartPointer<vtkAxesActor> axes_actor = vtkSmartPointer<vtkAxesActor>::New();
axes_actor->SetPosition(0, 0, 0);                       // 设置坐标轴的位置
axes_actor->SetTotalLength(2, 2, 2);                    // 设置坐标轴的长度
axes_actor->SetShaftType(0);                            // 设置坐标轴的类型,0表示圆柱体,1表示线段
axes_actor->SetCylinderRadius(0.03);                    // 设置坐标轴的圆柱体半径
axes_actor->SetAxisLabels(1);                           // 设置坐标轴的标签
axes_actor->SetTipType(0);                              // 设置坐标轴的箭头长度
axes_actor->SetXAxisLabelText("xxx");                   // 设置X轴标签
axes_actor->SetYAxisLabelText("yyy");                   // 设置Y轴标签
axes_actor->SetZAxisLabelText("zzz");                   // 设置Z轴标签
axes_actor->GetXAxisShaftProperty()->SetColor(1, 1, 1); // 设置X轴颜色

// 控制坐标系,使之随视角共同变化
MarkerWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
MarkerWidget->SetOrientationMarker(axes_actor);
MarkerWidget->SetInteractor(renwindow->GetInteractor());
MarkerWidget->SetViewport(0.0, 0.0, 0.2, 0.2);
MarkerWidget->SetEnabled(1);
MarkerWidget->SetOutlineColor(1, 0, 0);

// 圆锥示例
vtkSmartPointer<vtkConeSource> Cone = vtkSmartPointer<vtkConeSource>::New();
vtkSmartPointer<vtkPolyDataMapper> mapper_Cone = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper_Cone->SetInputConnection(Cone->GetOutputPort());

vtkSmartPointer<vtkActor> actor_Cone = vtkSmartPointer<vtkActor>::New();
actor_Cone->SetMapper(mapper_Cone);
renderer->AddActor(actor_Cone);

renderer->ResetCamera();

参考

https://blog.csdn.net/m0_67254672/article/details/133942602

posted @ 2025-01-16 18:14  ReRound  阅读(86)  评论(0)    收藏  举报