1. 程式人生 > >我不生產程式碼,我只是GitHub的搬運工

我不生產程式碼,我只是GitHub的搬運工

問題描述

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; }