vtk视图设置

问题描述

vtk中显示模型的各个视图,例如前视图、后视图、左视图、右视图等。

解析

我们通过调整相机位置、焦点位置、朝上方向来实现各个视图。

  • 相机位置:即相机所在的位置,用方法vtkCamera::SetPosition()设置;
  • 相机焦点:从相机看向的点,用方法vtkCamera::SetFocusPoint()设置;
  • 朝上方向:相机朝上的方向。就好比我们直立看东西,方向为头朝上,看到的东西也是直立的,如果我们倒立看某个东西,这时方向为头朝下,看到的东西当然就是倒立的。相机位置、相机焦点和朝上方向三个因素确定了相机的实际方向,即确定相机的视图。

这里写图片描述

放置几个模型:
这里写图片描述

各个视图:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

实现

#include <vtkSmartPointer.h>
#include <vtkCameraActor.h>
#include <vtkNamedColors.h>
#include <vtkSphereSource.h>
#include <vtkConeSource.h>
#include <vtkCubeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkCamera.h>
#include <vtkMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>

void ViewDirection(vtkRenderer *renderer,
                   double lookX, double lookY, double lookZ,
                   double upX, double upY, double upZ)
{
    renderer->GetActiveCamera()->SetPosition(0, 0, 0);    //相机位置
    renderer->GetActiveCamera()->SetFocalPoint(lookX, lookY, lookZ);    //焦点位置
    renderer->GetActiveCamera()->SetViewUp(upX, upY, upZ);    //朝上方向
    renderer->ResetCamera();
}

void ViewPositiveX(vtkRenderer *renderer)
{
    ViewDirection(renderer, 1, 0, 0, 0, 0, 1);
}

void ViewNegativeX(vtkRenderer *renderer)
{
    ViewDirection(renderer, -1, 0, 0, 0, 0, 1);
}

void ViewPositiveY(vtkRenderer *renderer)
{
    ViewDirection(renderer, 0, 1, 0, 0, 0, 1);
}

void ViewNegativeY(vtkRenderer *renderer)
{
    ViewDirection(renderer, 0, -1, 0, 0, 0, 1);
}

void ViewPositiveZ(vtkRenderer *renderer)
{
    ViewDirection(renderer, 0, 0, 1, 0, 1, 0);
}
void ViewNegativeZ(vtkRenderer *renderer)
{
    ViewDirection(renderer, 0, 0, -1, 0, 1, 0);
}

int main(int, char *[])
{
    auto namedColors = vtkSmartPointer<vtkNamedColors>::New();

    // X轴上放置立方体
    auto cubeSource = vtkSmartPointer<vtkCubeSource>::New();
    cubeSource->SetCenter(1000, 0, 0);
    cubeSource->SetXLength(1000);
    cubeSource->SetYLength(1000);
    cubeSource->SetZLength(1000);
    cubeSource->Update();

    auto cubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    cubeMapper->SetInputConnection(cubeSource->GetOutputPort());
    auto cubeActor = vtkSmartPointer<vtkActor>::New();
    cubeActor->SetMapper(cubeMapper);
    cubeActor->GetProperty()->SetDiffuseColor(
        namedColors->GetColor3d("Tomato").GetData());

    // Y轴放置圆球
    auto sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetCenter(0, 1000, 0);
    sphereSource->SetRadius(500);
    sphereSource->SetThetaResolution(64);
    sphereSource->SetPhiResolution(64);
    sphereSource->Update();

    auto sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
    auto sphereActor = vtkSmartPointer<vtkActor>::New();
    sphereActor->SetMapper(sphereMapper);
    sphereActor->GetProperty()->SetDiffuseColor(
        namedColors->GetColor3d("Tomato").GetData());

    // Z轴上放置圆锥
    auto coneSource = vtkSmartPointer<vtkConeSource>::New();
    coneSource->SetCenter(0, 0, 1000);
    coneSource->SetRadius(500);
    coneSource->SetHeight(1000);
    coneSource->SetDirection(0, 0, 1);
    coneSource->SetResolution(128);
    coneSource->Update();

    auto coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    coneMapper->SetInputConnection(coneSource->GetOutputPort());
    auto coneActor = vtkSmartPointer<vtkActor>::New();
    coneActor->SetMapper(coneMapper);
    coneActor->GetProperty()->SetDiffuseColor(
        namedColors->GetColor3d("Tomato").GetData());

    // Visualize
    auto renderer = vtkSmartPointer<vtkRenderer>::New();
    auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->SetSize(500, 500);
    renderWindow->AddRenderer(renderer);

    auto renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderer->SetBackground(namedColors->GetColor3d("SlateGray").GetData());
    renderer->AddActor(cubeActor);
    renderer->AddActor(sphereActor);
    renderer->AddActor(coneActor);
    renderer->ResetCamera();

    //ViewPositiveX(renderer);
    //ViewNegativeX(renderer);
    //ViewPositiveY(renderer);
    //ViewNegativeY(renderer);
    //ViewPositiveZ(renderer);
    ViewNegativeZ(renderer);

    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值