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

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

嵌入式技术的核心技术有哪些?请详细列举并解释每项技术的主要功能和应用场景。

嵌入式技术的核心技术包括处理器技术、IC技术和设计/验证技术。 1. 处理器技术    通用处理器:这类处理器适用于不同类型的应用,其主要特征是存储程序和通用的数据路径,使其能够处理各种计算任务。例如,在智能家居中,通用处理器可以用于控制和管理家庭设备,如灯光、空调和安全系统。    单用途处理器:这些处理器执行特定程序,如JPEG编解码器,专门用于视频信息的压缩或解压。在数字相机中,单用途

海鸥相机存储卡格式化如何恢复数据

在摄影的世界里,‌每一张照片都承载着独特的记忆与故事。‌然而,‌当我们不慎将海鸥相机的存储卡格式化后,‌那些珍贵的瞬间似乎瞬间消逝,‌让人心急如焚。‌但请不要绝望,‌数据恢复并非遥不可及。‌本文将详细介绍在海鸥相机存储卡格式化后,‌如何高效地恢复丢失的数据,‌帮助您重新找回那些宝贵的记忆。‌ 图片来源于网络,如有侵权请告知 一、‌回忆备份情况 ‌海鸥相机存储卡格式化如何恢复数据?在意

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

初步了解VTK装配体

VTK还不太了解,根据资料, vtk.vtkAssembly 是 VTK库中的一个重要类,允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtkimport mathfrom vtk.util.colors import *filenames = ["cylinder.stl","sphere.stl","torus.stl"]dt = 1.0renW