vtkFrustumSource来理解视锥体

#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,

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值