#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkFrustumSource.h>
#include <vtkMapper.h>
#include <vtkNamedColors.h>
#include <vtkPlanes.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkShrinkPolyData.h>
#include <vtkSmartPointer.h>
int main(int, char *[])
{
// 通过该类得到指定物体的颜色
vtkSmartPointer<vtkNamedColors> colors =
vtkSmartPointer<vtkNamedColors>::New();
vtkSmartPointer<vtkCamera> camera =
vtkSmartPointer<vtkCamera>::New();
camera->SetClippingRange(.1, .4);
double planesArray[24];
// 获取当前视锥体的6个平面
camera->GetFrustumPlanes(1.0, planesArray);
vtkSmartPointer<vtkPlanes> planes =
vtkSmartPointer<vtkPlanes>::New();
planes->SetFrustumPlanes(planesArray);
// 创建视锥体
vtkSmartPointer<vtkFrustumSource> frustumSource =
vtkSmartPointer<vtkFrustumSource>::New();
frustumSource->ShowLinesOff();
frustumSource->SetPlanes(planes);
// 缩放
vtkSmartPointer<vtkShrinkPolyData> shrink =
vtkSmartPointer<vtkShrinkPolyData>::New();
shrink->SetInputConnection(frustumSource->GetOutputPort());
shrink->SetShrinkFactor(.9);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(shrink->GetOutputPort());
vtkSmartPointer<vtkProperty> back =
vtkSmartPointer<vtkProperty>::New();
back->SetColor(colors->GetColor3d("Tomato").GetData());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->EdgeVisibilityOn();
actor->GetProperty()->SetColor(colors->GetColor3d("Banana").GetData());
// 设置反面颜色
actor->SetBackfaceProperty(back);
// a renderer and render window
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetWindowName("Frustum");
renderWindow->AddRenderer(renderer);
// an interactor
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// add the actors to the scene
renderer->AddActor(actor);
renderer->SetBackground(colors->GetColor3d("Silver").GetData());
// Position the camera so that we can see the frustum
renderer->GetActiveCamera()->SetPosition(1, 0, 0);
renderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);
renderer->GetActiveCamera()->SetViewUp(0, 1, 0);
renderer->GetActiveCamera()->Azimuth(30);
renderer->GetActiveCamera()->Elevation(30);
renderer->ResetCamera();
// render an image (lights and cameras are created automatically)
renderWindow->Render();
// begin mouse interaction
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
在透视投影中,三维模型中的视锥体,由相机位置,相机焦点,裁剪平面(近平面和远平面,屏幕与相机角度形成的裁剪?),相机的视角方向viewUp,