当前位置: 首页 > news >正文

VTK 三维场景的基本要素(相机) vtkCamera

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

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

1)相机位置:

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

2)相机焦点:

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

3)朝上方向:

朝上方向即哪个方向为相机朝上的方向。就好比直立看东西,方向为头朝上,看到的东西也是直立的,如果倒立看某个东西,这时方向头朝下,看到的东西就是倒立的。相机位置、相机焦点和朝上方向三个因素确定了相机的实际方向,即确定相机的试图。

4)投影方向:

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

5)投影方法: 该要素用于确定Actor是如何映射到像平面的。

vtkCamera定义了两种投影方法:

一种是正交投影(Orthographic Projection),也叫平行投影(Parallel Projection),即进入相机的光线与投影方向是平行的;

另一种是透视投影(Perspective Projection),即所有光线相较于一点。该投影方法最符合人类眼睛对于景物所产生的近大远小的视觉习惯。

6)视角:

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

7)前后裁剪平面:

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

相机的视野范围是一个锥状体; 相机位置和焦点位置定义了相机的位置和投影方向,前裁剪平面与后裁剪平面 之间为可见区域

相机坐标

相机所在的位置坐标;

   void SetPosition(double x, double y, double z);void SetPosition(const double a[3]) { this->SetPosition(a[0], a[1], a[2]); }vtkGetVector3Macro(Position, double);

相机焦点

相机焦点所在的位置坐标;

   void SetFocalPoint(double x, double y, double z);void SetFocalPoint(const double a[3]) { this->SetFocalPoint(a[0], a[1], a[2]); }vtkGetVector3Macro(FocalPoint, double);

通过设置相机焦点与相机坐标的距离,来移动焦点坐标,注意:设置的值必须为正值。

void SetDistance(double);
vtkGetMacro(Distance, double);  

朝上方向

使用SetViewUp设置相机的朝上方向;
一般默认朝上方向是Y轴正向:(0,1,0);
修改相机的朝上方向,可以实现相机绕XYZ轴旋转的功能;
一般情况都是写0或者1,如果是斜着旋转,就要输入0-1范围内的小数,大家可以动手自己实验一下;

   void SetViewUp(double vx, double vy, double vz);void SetViewUp(const double a[3]) { this->SetViewUp(a[0], a[1], a[2]); }vtkGetVector3Macro(ViewUp, double);

投影方式

设置/获取ParallelProjection实例变量的值。
这决定了相机应该进行透视投影还是平行投影。

   void SetParallelProjection(vtkTypeBool flag);vtkGetMacro(ParallelProjection, vtkTypeBool);vtkBooleanMacro(ParallelProjection, vtkTypeBool);

投影方向

投影方向是指从相机位置到焦点方向的矢量。

double DirectionOfProjection[3];
vtkGetVector3Macro(DirectionOfProjection, double);

这通常与ViewPlaneNormal相反,即垂直于屏幕的向量,除非视图是倾斜的。
旋转

void Roll(double angle):围绕投影方向旋转相机
void Azimuth(double angle); 以焦点为中心,围绕朝上方向方向向量,即在焦点为中心,焦距为半径的圆球的维度线上水平旋转;
void Elevation(double angle); 以焦点为中心,在焦点为中心,焦距为半径的圆球的经度线方向上旋转垂直旋转;

void Yaw(double angle); 同Azimuth相似,以相机为中心,移动焦点坐标;
void Pitch(double angle); 同Elevation相似,以相机为中心,移动焦点坐标;


调整裁剪平面距离

ClippingRange即剪切平面,分为前后两个。只有在这两个剪切平面之间的内容才会被渲染和显示。默认值是(0.1,1000)。这个量一般不需要修改,而是在vtkRenderer对象中调用ResetCameraClippingRange()方法来自动重设渲染范围。如果你的图像显示不完整,但是稍微用鼠标旋转或平移一下又变完整了。建议试一下调用一次这个方法。
设置前裁剪平面和后裁剪平面,前裁剪平面就是距离相机较近的平面,后平面就是距离相机较远位置;
dNear和dFar是距离相机坐标的距离,在相机坐标向焦点方向上的距离;

void SetClippingRange(double dNear, double dFar);
void SetClippingRange(const double a[2]) { this->SetClippingRange(a[0], a[1]); }
vtkGetVector2Macro(ClippingRange, double);

重置相机参数

vtkRenderer类可以重置使用的相机参数;
virtual void ResetCamera();
根据可见的vtkActor自动设置相机参数。使得相机会重新定位以观察演员的中心点,并沿其初始视图平面法线移动(即,从镜头位置到焦点),这样所有的vtkActor都可以在相机中看到。
从源码中可以看到ResetCamera()只会重置相机的焦点焦距朝上方向等信息,不会重置旋转角度,如果要从一个Renderer中获取多个旋转后图像,需要对角度进行修正后计算,每次ResetCamera()都会保留上一次旋转的角度;

相关文章:

  • 知识图谱 多模态学习 2024 最新综述
  • nginx限制网段访问
  • 算法沉淀——哈希算法(leetcode真题剖析)
  • OpenGL-ES 学习(2)---- DepthTest
  • 【头歌·计组·自己动手画CPU】三、存储系统设计(HUST)(理论版) 【计算机硬件系统设计】
  • 3D裸眼技术行业研究:2026年市场投资规模为10.78亿元
  • 前端vite+vue3——自动化配置路由布局
  • LLM大模型相关问题汇总---包括问题与答案
  • BUGKU-WEB 矛盾
  • 书生浦语大模型实战营-课程笔记(2)
  • 数据结构:并查集讲解
  • Uipath 实现Excel 文件合并
  • 龟速乘法+快速幂,P2044 [NOI2012] 随机数生成器
  • 代码解读:Stable Video Diffusion 中对运动程度的控制
  • 前端秘法基础式(HTML)(第二卷)
  • Google 是如何开发 Web 框架的
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • const let
  • docker python 配置
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • HTTP 简介
  • maven工程打包jar以及java jar命令的classpath使用
  • Webpack 4 学习01(基础配置)
  • webpack项目中使用grunt监听文件变动自动打包编译
  • web标准化(下)
  • 初探 Vue 生命周期和钩子函数
  • 给新手的新浪微博 SDK 集成教程【一】
  • 诡异!React stopPropagation失灵
  • 实战|智能家居行业移动应用性能分析
  • 算法---两个栈实现一个队列
  • 微服务入门【系列视频课程】
  • 一些css基础学习笔记
  • !!Dom4j 学习笔记
  • #微信小程序:微信小程序常见的配置传旨
  • $.ajax,axios,fetch三种ajax请求的区别
  • (0)Nginx 功能特性
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (solr系列:一)使用tomcat部署solr服务
  • (二)换源+apt-get基础配置+搜狗拼音
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (利用IDEA+Maven)定制属于自己的jar包
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (一)插入排序
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net MySql
  • .NetCore 如何动态路由
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • /*在DataTable中更新、删除数据*/
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [20150904]exp slow.txt