问题描述
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;
}