VTK 中的坐标变换 | 进阶

VTK 中的坐标变换 | 进阶

前情提要

之前我们介绍了 3 种VTK 中的坐标变换方法:

  1. 旋转摄像机
  2. 针对 vtkActor 的变换
  3. 使用 vtkTransformFilter

绘制坐标轴

#include "VTKCoordinateTransform.h"

#include <vtkLineSource.h>
#include <vtkBYUReader.h>
#include <vtkNamedColors.h>
#include <vtkTransform.h>
#include <vtkTransformFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
#include <vtkRenderWindow.h>

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

    this->_pVTKWidget = new QVTKOpenGLNativeWidget();
    this->setCentralWidget(_pVTKWidget);
    // this->showMaximized();

    vtkNew<vtkRenderer> renderer;
    this->_pVTKWidget->renderWindow()->AddRenderer(renderer);
    this->_pVTKWidget->renderWindow()->Render();

    this->_widgetCamOrien = vtkCameraOrientationWidget::New();
    this->_widgetCamOrien->SetParentRenderer(renderer);
    this->_widgetCamOrien->On();

    vtkNew<vtkNamedColors> colors;

    vtkNew<vtkBYUReader> cow;
    cow->SetFileName("cow.g");

    vtkNew<vtkPolyDataMapper> mapper;
    mapper->SetInputConnection(cow->GetOutputPort());

    vtkNew<vtkActor> actor;
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(colors->GetColor3d("Gold").GetData());
    // actor->RotateY(45);

    renderer->AddActor(actor);
    renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());

    // renderer->GetActiveCamera()->Azimuth(90);
    renderer->ResetCamera();

    vtkNew<vtkTransform> transform;
    transform->Translate(10, 0, 0);
    transform->RotateY(90);
    transform->Translate(-10, 0, 0);

    vtkNew<vtkTransformFilter> transFilter;
    transFilter->SetInputConnection(cow->GetOutputPort());
    transFilter->SetTransform(transform);

    vtkNew<vtkPolyDataMapper> transMapper;
    transMapper->SetInputConnection(transFilter->GetOutputPort());

    vtkNew<vtkActor> transActor;
    transActor->SetMapper(transMapper);
    transActor->GetProperty()->SetColor(colors->GetColor3d("Silver").GetData());

    renderer->AddActor(transActor);
    renderer->ResetCamera();

    vtkNew<vtkLineSource> lineX;
    lineX->SetPoint1(0, 0, 0);
    lineX->SetPoint2(10, 0, 0);
    vtkNew<vtkPolyDataMapper> mapperX;
    mapperX->SetInputConnection(lineX->GetOutputPort());
    vtkNew<vtkActor> actorX;
    actorX->SetMapper(mapperX);
    actorX->GetProperty()->SetLineWidth(5);
    actorX->GetProperty()->SetColor(255, 0, 0);

    vtkNew<vtkLineSource> lineY;
    lineY->SetPoint1(0, 0, 0);
    lineY->SetPoint2(0, 10, 0);
    vtkNew<vtkPolyDataMapper> mapperY;
    mapperY->SetInputConnection(lineY->GetOutputPort());
    vtkNew<vtkActor> actorY;
    actorY->SetMapper(mapperY);
    actorY->GetProperty()->SetLineWidth(5);
    actorY->GetProperty()->SetColor(0, 255, 0);

    vtkNew<vtkLineSource> lineZ;
    lineZ->SetPoint1(0, 0, 0);
    lineZ->SetPoint2(0, 0, 10);
    vtkNew<vtkPolyDataMapper> mapperZ;
    mapperZ->SetInputConnection(lineZ->GetOutputPort());
    vtkNew<vtkActor> actorZ;
    actorZ->SetMapper(mapperZ);
    actorZ->GetProperty()->SetLineWidth(5);
    actorZ->GetProperty()->SetColor(0, 0, 255);

    renderer->AddActor(actorX);
    renderer->AddActor(actorY);
    renderer->AddActor(actorZ);

    vtkNew<vtkLineSource> lineA;
    lineA->SetPoint1(10, 0, 0);
    lineA->SetPoint2(10, 10, 0);
    vtkNew<vtkPolyDataMapper> mapperA;
    mapperA->SetInputConnection(lineA->GetOutputPort());
    vtkNew<vtkActor> actorA;
    actorA->SetMapper(mapperA);
    actorA->GetProperty()->SetLineWidth(5);
    actorA->GetProperty()->SetColor(0, 255, 255);

    renderer->AddActor(actorA);
}

VTKCoordinateTransform::~VTKCoordinateTransform()
{
    delete this->_pVTKWidget;
    this->_widgetCamOrien->Delete();
}

旋转的步骤:

  1. 向 X 轴平移 10
  2. 旋转 90 度
  3. 向 X 轴平移 10

效果:

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值