1.VTK中相机原理及控制属性

观众的眼睛就好比三维渲染场景中的相机,VTK则是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面,如屏幕、图像等。下图为相机投影示意图:

从上图可以看出与相机投影相关的因素主要有:
相机位置:即相机所在的位置,用方法vtkCamera::SetPosition()设置。
相机焦点:用方法vtkCamera::SetFocusPoint()设置,默认的焦点位置在世界坐标系的原点。
朝上方向:即哪个方向为相机朝上的方向。就好比我们直立看东西,方向为头朝上,看到的东西也是直立的,如果我们倒立看某个东西,这时方向为头朝下,看到的东西当然就是倒立的。相机位置、相机焦点和朝上方向三个因素确定了相机的实际方向,即确定相机的视图。

投影方向:相机位置到相机焦点的向量方向即为投影方向。
投影方法:确定Actor是如何映射到像平面的。vtkCamera定义了两种投影方法,一种是正交投影(OrthographicProjection),也叫平行投影(Parallel Projection),即进入相机的光线与投影方向是平行的。另一种是透视投影(PerspectiveProjection),即所有的光线相交于一点。
视角:透视投影时需要指定相机的视角(View Angle),默认的视角大小为30º,可以用方法vtkCamera::SetViewAngle()设置。
前后裁剪平面:裁剪平面与投影方向相交,一般与投影方向也是垂直的。裁剪平面主要用于评估Actor与相机距离的远近,只有在前后裁剪平面之间的Actor才是可见的。裁剪平面的位置可以用方法vtkCamera::SetClippingRange()设置。

2.相机使用方法示例

首先要记住一点的是Camera是Renderer(三维场景)的构成要素。
如果想获取vtkRenderer里默认的相机,可以用方法vtkRenderer::GetActiveCamera()。
相机vtkCamera的使用方法:
vtkSmartPointer<vtkCamera>myCamera = vtkSmartPointer<vtkCamera>::New();
myCamera->SetClippingRange(0.0475,2.3786); //这些值随便设置的,东灵提供的
myCamera->SetFocalPoint(0.0573,-0.2134, -0.0523);
myCamera->SetPosition(0.3245,-0.1139, -0.2932);//是否要保证相机位置-焦点向量 与 相机位置-向上方向 正交??
myCamera->ComputeViewPlaneNormal();//重新计算视平面法向量  平行于 相机-焦点
myCamera->SetViewUp(-0.2234,0.9983, 0.0345);
renderer->SetActiveCamera(myCamera); //激活新生成的相机

上述用SetClippingRange();SetFocalPoint();SetPosition()分别设置相机的前后裁剪平面,焦点和位置。ComputeViewPlaneNormal()方法是根据设置的相机位置、焦点等信息,重新计算视平面(View Plane)的法向量。一般该法向量与视平面是垂直的,如果不是垂直的话,Actor等看起来会有一些特殊的效果,如错切。SetViewUp()方法用于设置相机朝上方向。最后用方法vtkRenderer::SetActiveCamera()把相机设置到渲染场景中。
vtkCamera除了提供设置与相机投影因素相关的方法之外,还提供了大量的控制相机运动的方法,如:vtkCamera::Dolly(),vtkCamera::Roll(),vtkCamera::Azimuth(),vtkCamera::Yaw(),vtkCamera::Elevation(),vtkCamera::Pitch(),vtkCamera::Zoom()。这些方法具体表示相机是怎么运动,以及相对哪个位置或者方向运动。

3.相机运动方向示意图

关于控制相机的运动更详细的方法应该参考Camera说明文档。

4.相机简单测试

  vtkSmartPointer<vtkCamera> mycamera =vtkSmartPointer<vtkCamera>::New();mycamera->SetFocalPoint(0,0,0);mycamera->SetPosition(-5,0,0);mycamera->SetClippingRange(5.5,6.5);mycamera->ComputeViewPlaneNormal();mycamera->SetViewUp(0,1,0);renderer->SetActiveCamera(mycamera);
 vtkSmartPointer<vtkCamera> mycamera =vtkSmartPointer<vtkCamera>::New();mycamera->SetFocalPoint(0,0,0);mycamera->SetPosition(-10,0,0);mycamera->SetClippingRange(10.5,11.5);mycamera->ComputeViewPlaneNormal();mycamera->SetViewUp(0,1,0);renderer->SetActiveCamera(mycamera);
  vtkSmartPointer<vtkCamera> mycamera =vtkSmartPointer<vtkCamera>::New();mycamera->SetFocalPoint(0,0,0);mycamera->SetPosition(-10,0,0);mycamera->SetClippingRange(5,9);mycamera->ComputeViewPlaneNormal();mycamera->SetViewUp(0,1,0);renderer->SetActiveCamera(mycamera);

前后裁剪平面不合法。

VTK修炼之道8_三维场景基本要素:相机相关推荐

  1. VTK修炼之道7_三维场景基本要素:光照

    1.VTK中的光照长得什么样? 剧场里有各式各样的灯光,三维渲染场景中也一样,可以有多个光照存在.光照和相机是三维渲染场景必备的因素,如果没有指定,vtkRenderer会自动地创建默认的光照和相机. ...

  2. VTK修炼之道6_仔细分析一个复杂程序

    1.程序代码 #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); / #include <vtkSmartPo ...

  3. VTK修炼之道64:纹理映射体绘制_三维纹理映射

    1.三维纹理映射 目前市面上的能多先科都是支持三维纹理映射的.利用三维纹理映射,将体数据映射至一组与视图平面平行的多边形,避免了二维纹理映射方法中因为纹理图像的切换造成的瑕疵.VTK中三维纹理映射体绘 ...

  4. VTK修炼之道56:图形基本操作进阶_表面重建技术(三维点云曲面重建)

    1.点云重建 虽然Delaunay三角剖分算法可以实现网格曲面重建,但是其应用主要在二维剖分,在三维空间网格生成中遇到了问题.因为在三维点云曲面重建中,Delaunay条件不在满足,不仅基于最大最小角 ...

  5. VTK修炼之道27:图像基本操作_三维图像切片交互提取(回调函数、观察者-命令模式)

    1.鼠标滑动提取三维图像切片 学习三维图像切面的提取后,我们可以实现一个稍微复杂的程序--通过滑动鼠标来切换三维图像切片,这也是医学图像处理软件中一个很基本的功能.实现该功能难点是怎样在VTK中控制鼠 ...

  6. VTK修炼之道26:图像基本操作_三维图像切片提取

    1.三维图像切片提取 切片是指三维图像中的一个切面对应的图像.切面可以是过图像内部一点且平行于XY.YZ.XZ平面的平面,也可以是任意的过三维图像内部一点任意方向的平面.通过提取切片可以方便的浏览和分 ...

  7. VTK修炼之道78:交互与拾取_点拾取

    1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...

  8. VTK修炼之道73:交互部件_Widget应用综述

    1.交互器样式遇到的难题 交互器样式(如vtkInteractorStyleImage)主要是根据不同的键盘.鼠标等消息来控制相机(vtkCamera)/Actor等相关参数,从而达到了交互的目的! ...

  9. VTK修炼之道57:图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)

    1.点云配准 在计算机逆向工程中,通过三维扫描等实物数字化技术可以获取各种点云数据.但是受到测量环境和设备的影响,再一次测量的情况下,难以获取实物整体的点云数据,因此需要多次从不同角度进行测量.但不同 ...

最新文章

  1. 【青少年编程】【三级】计算成绩总和
  2. 尚学堂requireJs课程---1、作用域回顾
  3. 使用log4jdbc记录SQL信息
  4. 用Latex写IEEE论文
  5. 【阿里云课程】残差网络原理,结构发展及有效性理解
  6. QT使用winsocket
  7. STM32 CAN错误管理
  8. P2634 [国家集训队]聪聪可可
  9. 对于我今后人生受益匪浅的几句话
  10. b-tree的索引页总览
  11. Consul注册中心删除某个服务
  12. DockerKubernetes ❀ Kubernetes集群 - DashBoard服务(Web管理)安装部署
  13. 【使用Pytorch实现ResNet网络模型:ResNet50、ResNet101和ResNet152】
  14. Spring boot整合人大金仓(KingBaseEs)国产数据库
  15. JP1081B/9700_USB网卡驱动
  16. uni-app和H5页面使用支付宝登陆问题解决
  17. 中山医06年考研初试复试全攻略!( 完整版)
  18. MMO与弱交互游戏的服务端技术区别
  19. 用R语言开始量化投资
  20. 解决pip下载速度慢的问题:更换国内源

热门文章

  1. C语言指针和链表的体会
  2. Java HashMap的死循环问题
  3. 经典递归——斐波那契数列,汉诺塔
  4. 本地连接虚拟机的redis
  5. Java基础01 从HelloWorld到面向对象
  6. poj 2288(状态压缩dp + TSP问题)
  7. mysql数据库配置文件my.ini
  8. 修改git commit默认触发的编辑器
  9. Android项目打包开启proguard的混淆优化带来的问题
  10. CString类型的头文件、CString的输出、CString的常用用法