VTK学习-vtkCamera
来源:互联网 发布:姓氏排序软件 编辑:程序博客网 时间:2024/06/05 03:36
写在前面:
这篇博客主要记录书中有关于vtkCamera的相关内容整理。同样也比较基础,只是希望梳理一下,慢慢学习。
vtkCamera基本概念:
相机的概念就就当于观看舞台上演员演出的眼睛。观众可以位于不同的地方、不同角度观看表演,从而得到不同的观感。那么相机也是,VTK中利用vtkCmaera来表示相机,负责将三维场景投影到二维平面,最常用的就是电脑屏幕。相机投影相关的要素可如下图表示:
图1.相机vtkCamera投影示意图
那么相机相关的要素主要有:
- 相机位置。通过vtkCamera::SetPosition()函数设置相机的位置。传入为一个三维坐标位置。
- 相机焦点。通过vtkCamera::SetFocusPoint()函数设置焦点位置。默认位置在世界坐标系的原点。
- 朝上方向。通过vtkCamera::SetViewUp()函数设置相机朝上方向。传入一个三维(x,y,z)向量。也就表示从(0,0,0)到(x,y,z)的向量。默认为(0,1,0)。前三个确定了相机的实际方向。视图也通过这三个参数确定。
- 投影方向。相机位置到相机焦点的向量方向即为投影方向。可以通过vtkCamera::GetDirectionOfPrijection()函数获得该向量。
- 投影方法。投影方法有两种:一、正交投影,Orthographic Projection,也叫平行投影,Parallel Projection,进入相机的光线与投影方向平行。二、透视投影,Perspective Projection,进入相机的光纤相交于一点。这种投影方式会产生近大远小的视觉习惯。。可以通过vtkCamera::SetParallelProjection(int flag)函数来设定相机采用那几种投影方法。
- 视角。View Angle。默认视角大小为30°。可以通过vtkCamera::SetViewAngle()来设置。
- 前后裁剪平面。裁剪平面与投影方向相交,一般与投影方向垂直。注意,只有在前后裁剪平面之间的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;}
运行结果如下图所示:
感觉对于具体的相机参数设置不太熟练,所以试了几次得到这样一个图。仍然可以调整。
阅读全文
1 0
- VTK学习-vtkCamera
- VTK学习-VTK管线
- VTK学习-VTK基本数据结构
- VTK学习笔记:使用VTK交互功能
- VTK学习(二)VTK图像创建
- VTK学习(四)vtk程序实例
- VTK学习(八)vtk管线
- VTK学习(九)VTK基本数据结构
- VTK学习(十一)VTK图像显示
- 继续学习VTK
- 学习VTK的心得
- VTK学习2
- vtk学习一
- vtk学习二
- VTK 学习笔记 - 天行健
- 01-从零开始学习VTK
- VTK学习笔记1
- VTK学习笔记-1
- Codeforces Round #225 (Div. 1) B 模拟:
- Mysql查询数据时,自动为结果编上序号
- 线性约束自适应波束形成
- Windows进程内存计算
- java框架总结1.0
- VTK学习-vtkCamera
- 进程间通信方式预习1
- python 异常处理
- 最全最好用的Android Studio插件整理
- Kafka 笔记
- 1018. 锤子剪刀布 (20) PAT乙级真题
- Android实现网络多线程断点续传下载
- Spring简介
- 基于Scrapyd的爬虫部署