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

2024-02-12 14:28

本文主要是介绍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()都会保留上一次旋转的角度;

这篇关于VTK 三维场景的基本要素(相机) vtkCamera的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702767

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,