VTK学习-vtkCamera

来源:互联网 发布:姓氏排序软件 编辑:程序博客网 时间:2024/06/05 03:36

写在前面:

这篇博客主要记录书中有关于vtkCamera的相关内容整理。同样也比较基础,只是希望梳理一下,慢慢学习。

vtkCamera基本概念:

相机的概念就就当于观看舞台上演员演出的眼睛。观众可以位于不同的地方、不同角度观看表演,从而得到不同的观感。那么相机也是,VTK中利用vtkCmaera来表示相机,负责将三维场景投影到二维平面,最常用的就是电脑屏幕。相机投影相关的要素可如下图表示:


图1.相机vtkCamera投影示意图

那么相机相关的要素主要有:

  1. 相机位置。通过vtkCamera::SetPosition()函数设置相机的位置。传入为一个三维坐标位置。
  2. 相机焦点。通过vtkCamera::SetFocusPoint()函数设置焦点位置。默认位置在世界坐标系的原点。
  3. 朝上方向。通过vtkCamera::SetViewUp()函数设置相机朝上方向。传入一个三维(x,y,z)向量。也就表示从(0,0,0)到(x,y,z)的向量。默认为(0,1,0)。前三个确定了相机的实际方向。视图也通过这三个参数确定。
  4. 投影方向。相机位置到相机焦点的向量方向即为投影方向。可以通过vtkCamera::GetDirectionOfPrijection()函数获得该向量。
  5. 投影方法。投影方法有两种:一、正交投影,Orthographic Projection,也叫平行投影,Parallel Projection,进入相机的光线与投影方向平行。二、透视投影,Perspective Projection,进入相机的光纤相交于一点。这种投影方式会产生近大远小的视觉习惯。。可以通过vtkCamera::SetParallelProjection(int flag)函数来设定相机采用那几种投影方法。
  6. 视角。View Angle。默认视角大小为30°。可以通过vtkCamera::SetViewAngle()来设置。
  7. 前后裁剪平面。裁剪平面与投影方向相交,一般与投影方向垂直。注意,只有在前后裁剪平面之间的Actor才可见(本科好像在应用光学中学过这个)。可以通过vtkCamera::SetClippingRange(double dNear, double dFar)函数设置,前一个参数是离相机近的,后一个参数是离相机远的平面。默认参数范围是(0.1,1000)。

更多详细函数可以参考VTK官方文档:vtkCamera Class Reference。

vtkCamera常用函数:

常用的相机属性设定方法在前面说的比较详细了。这里说一下创建和添加Camera的方法。
在使用vtkCamera之前需要包含相关头文件:

#include <vtkCamera.h>

利用vtkSmartPointer创建vtkCamera:

vtkSmartPointer<vtkCamera>myCamera=vtkSmartPointer<vtkCamera>::New();

将相机设置到渲染场景中:

renderer->SetActiveCamera(myCamera);

通过vtkRenderer::SetActiveCamera(vtkCamera *)函数完成设置。
除此之外,vtkCamera还提供了许多的控制相机运动的函数,比如Dolly(),Roll(),Azimuth(),Yaw(),Elevation(),Pitch()和Zoom()。在我之前提供的vtkCamera文档链接中,有关于这些函数的使用方法。但是具体使用方法与使用效果我还不是特别清楚。因为根据书中要下载vtk-5.10.0-win32-x86.exe这个程序,我没找到连接。所以只能参考书中的参考图了。


图2.相机运动方向示意图
这里写图片描述

vtkCamera使用详例:

#include <vtkRenderWindow.h>#include <vtkSmartPointer.h>#include <vtkRenderer.h>#include <vtkRenderWindowInteractor.h>#include <vtkInteractorStyleTrackballCamera.h>#include <vtkCylinderSource.h>#include <vtkPolyDataMapper.h>#include <vtkActor.h>#include <vtkLight.h>#include <vtkCamera.h>int main(){    vtkSmartPointer<vtkCylinderSource>cylinder=    vtkSmartPointer<vtkCylinderSource>::New();    cylinder->SetHeight(3.0);    cylinder->SetRadius(1.0);    cylinder->SetResolution(10);    vtkSmartPointer<vtkPolyDataMapper>cylinderMapper=    vtkSmartPointer<vtkPolyDataMapper>::New();    cylinderMapper->SetInputConnection(cylinder->GetOutputPort());    vtkSmartPointer<vtkActor>cylinderActor=vtkSmartPointer<vtkActor>::New();    cylinderActor->SetMapper(cylinderMapper);    //cylinderActor->SetTexture(texture);    vtkSmartPointer<vtkRenderer>renderer=vtkSmartPointer<vtkRenderer>::New();    renderer->AddActor(cylinderActor);    renderer->SetBackground(0.1,0.2,0.4);    vtkSmartPointer<vtkRenderWindow>renwin=vtkSmartPointer<vtkRenderWindow>::New();    renwin->AddRenderer(renderer);    renwin->SetSize(640,480);    renwin->Render();    renwin->SetWindowName("RenderCylinder-Lights");    vtkSmartPointer<vtkRenderWindowInteractor>iren=vtkSmartPointer<vtkRenderWindowInteractor>::New();    iren->SetRenderWindow(renwin);    vtkSmartPointer<vtkInteractorStyleTrackballCamera>style=vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();    iren->SetInteractorStyle(style);    vtkSmartPointer<vtkLight>myLight=vtkSmartPointer<vtkLight>::New();    myLight->SetColor(0,1,0);    myLight->SetPosition(0,0,1);    myLight->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());    renderer->AddLight(myLight);    vtkSmartPointer<vtkLight> myLight2 =    vtkSmartPointer<vtkLight>::New();    myLight2->SetColor(0,1,1);    myLight2->SetPosition(0,0,-1);    myLight2->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());    renderer->AddLight(myLight2);    vtkSmartPointer<vtkCamera>myCamera=vtkSmartPointer<vtkCamera>::New();    myCamera->SetClippingRange(0.0475,2.3786);    myCamera->SetFocalPoint(0.0573,-0.2134,-0.0523);    myCamera->SetPosition(2,-2,-2);    myCamera->SetViewUp(-0.2234,0.9983,0.0345);    renderer->SetActiveCamera(myCamera);    iren->Initialize();    iren->Start();    return EXIT_SUCCESS;}

运行结果如下图所示:
这里写图片描述

感觉对于具体的相机参数设置不太熟练,所以试了几次得到这样一个图。仍然可以调整。

原创粉丝点击