VTK 相机类:vtkCamera

VTK 相机类:vtkCamera

vtkCamera 类简介

VTK使用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面,如屏幕、图像等。它提供了定位和定向视点到焦点的方法,还提供了围绕焦点移动的方便操作;更复杂的方法允许操纵计算机图形模型,包括视图上方向向量、剪裁平面和相机透视。

在这里插入图片描述

相机投影

下图为相机投影示意图:

在这里插入图片描述

与相机投影相关的要素主要有如下几个:

  • 相机位置:即相机所在的位置,用方法vtkCamera::SetPosition()设置。

  • 相机焦点:用方法vtkCamera::SetFocusPoint()设置,默认的焦点位置在世界坐标系的原点。

  • 朝上方向:即哪个方向为相机朝上的方向,用方法vtkCamera::SetViewUp()设置。就好比我们直立看东西,方向为头朝上,看到的东西也是直立的,如果我们倒立看某个东西,这时方向为头朝下,看到的东西当然就是倒立的。相机位置、相机焦点和朝上方向三个因素确定了相机的实际方向,即确定相机的视图。

  • 投影方向:相机位置到相机焦点的向量方向即为投影方向。

  • 投影方法:确定Actor是如何映射到像平面的。vtkCamera定义了两种投影方法,一种是正交投影(OrthographicProjection),也叫平行投影(Parallel Projection),即进入相机的光线与投影方向是平行的。另一种是透视投影(Perspective Projection),即所有的光线相交于一点。

  • 视角:透视投影时需要指定相机的视角(View Angle),默认的视角大小为30º,可以用方法vtkCamera::SetViewAngle()设置。

  • 前后裁剪平面:裁剪平面与投影方向相交,一般与投影方向也是垂直的。裁剪平面主要用于评估Actor与相机距离的远近,只有在前后裁剪平面之间的Actor才是可见的。裁剪平面的位置可以用方法vtkCamera::SetClippingRange()设置。

vtkCamera 类常用函数

设置相机的朝上方向,默认为(0, 1, 0):

void vtkCamera::SetViewUp(double vx, double vy, double vz);

设置相机位置,默认为(0, 0, 1):

void vtkCamera::SetPosition(double x, double y, double z);

设置焦点,默认为(0, 0, 0):

void vtkCamera::SetFocalPoint(double x, double y, double z);

设置前后裁剪平面位置,默认为(0.1, 1000):

void vtkCamera::SetClippingRange(double dNear, double dFar);

设置相机视角,默认为30度,如果为平行投影则该角度无效:

void vtkCamera::SetViewAngle(double angle);

根据设置的相机位置、焦点等信息,重新计算视平面(View Plane)的法向量:

void vtkCamera::ComputeViewPlaneNormal(); // 

一般该法向量与视平面是垂直的,如果不是垂直的话,Actor等看起来会有一些特殊的效果,如错切。

vtkRenderer类自带一个默认的相机类,可以获取该相机,也可以设置自己的相机:

vtkRenderer::GetActiveCamera() // 获取vtkRenderer渲染器里默认的相机
vtkRenderer::SetActiveCamera() // 把相机设置到渲染场景中
vtkRenderer::ResetCamera() // 重设相机参数

vtkCamera 控制相机运动

在这里插入图片描述

缩放相机与焦点的距离:

vtkCamera::Dolly(double value);

将相机与焦点的距离除以给定的推拉值。使用大于1的值向焦点推拉,使用小于1的值远离焦点推拉。

绕投影方向旋转:

vtkCamera::Roll(double angle);

围绕投影方向旋转相机。这将使摄影机绕其轴旋转。

水平方向旋转相机:

vtkCamera::Azimuth(double angle);

围绕以焦点为中心的视图向上矢量旋转相机。请注意,视图向上矢量是通过SetViewUp设置的,不一定垂直于投影方向。结果是相机的水平旋转(纬度)。

水平方向旋转场景:

vtkCamera::Yaw(double angle);

使用相机的位置作为旋转中心,围绕视图向上矢量旋转焦点。请注意,视图向上矢量是通过SetViewUp设置的,不一定垂直于投影方向。结果是场景的水平旋转(纬度)。

垂直方向旋转场景:

vtkCamera::Elevation(double angle);

使用焦点作为旋转中心,围绕投影方向的负值与视图向上向量的叉积旋转相机。结果是场景的垂直旋转(经度)。

垂直方向旋转相机:

vtkCamera::Pitch(double angle);

使用相机的位置作为旋转中心,围绕视图向上矢量和投影方向的叉积旋转焦点。结果是摄影机垂直旋转(经度)。

缩放视角:

vtkCamera::Zoom(double factor);

在透视模式下,将视角减小指定的因子。在平行模式下,将平行比例减小指定的因子。值大于1表示放大,值小于1表示缩小。注意:当UseExplicitProjectionTransformMatrix为true时,将忽略此设置。

参考

  1. https://blog.csdn.net/liushao1031177/article/details/116903698
  2. https://blog.csdn.net/m0_67254672/article/details/135838842
  3. https://blog.csdn.net/shenziheng1/article/details/52769431
  4. https://blog.csdn.net/colddie/article/details/16948231
  5. https://blog.csdn.net/Goofy2014/article/details/40594983
  6. https://blog.csdn.net/weixin_38293453/article/details/103800090
  7. https://blog.csdn.net/Q1302182594/article/details/45771371
  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值