我不生產程式碼,我只是GitHub的搬運工
阿新 • • 發佈:2019-01-24
問題描述
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;
}