VTK中对于相机camera的设置

news/2024/12/1 11:12:13/

1. 相机的核心属性

在 VTK 中,vtkCamera 的核心属性有默认值。如果你不设置这些属性,相机会使用默认值来渲染场景。

  1. Position(默认值:(0, 0, 1)

    • 默认情况下,相机位于 Z 轴正方向的 (0, 0, 1) 位置。
    • 这是一个距离原点 1 个单位距离的位置。
  2. FocalPoint(默认值:(0, 0, 0)

    • 默认焦点是原点 (0, 0, 0),相机默认“看向”原点。
  3. ViewUp(默认值:(0, 1, 0)

    • 默认“上方向”是 Y 轴正方向 (0, 1, 0)
  4. ViewPlaneNormal(隐式计算)

    • 默认情况下,ViewPlaneNormal 是从 Position 到 FocalPoint 的单位向量,即 (0, 0, -1)

2. 相机的常用方法

以下是 VTK 相机中常用方法的详细说明,包括作用、用法,以及默认状态


(1)位置调整方法

这些方法用于设置或调整相机的位置和焦点。

1. SetPosition(x, y, z)
  • 作用:设置相机在 3D 空间中的位置。
  • 用法camera.SetPosition(10, 10, 10) 将相机放置在 (10, 10, 10)
  • 默认状态:如果未设置,相机默认位置为 (0, 0, 1),位于 Z 轴正方向。
2. SetFocalPoint(x, y, z)
  • 作用:设置相机“看向”的焦点。
  • 用法camera.SetFocalPoint(0, 0, 0) 将相机的焦点设置为原点。
  • 默认状态:如果未设置,焦点默认为原点 (0, 0, 0)
3. SetViewUp(x, y, z)
  • 作用:设置相机的“上方向”。
  • 用法camera.SetViewUp(0, 1, 0) 设置 Y 轴为“上方向”。
  • 默认状态:如果未设置,“上方向”默认为 Y 轴正方向 (0, 1, 0)
4. Dolly(factor)
  • 作用:缩放相机视图,即沿视线方向移动相机。
  • 用法camera.Dolly(2.0) 将相机拉近到焦点的 1/2 距离。
  • 默认状态:如果未调用,Dolly 不会影响相机,默认距离由 Position 和 FocalPoint 决定。
5. Zoom(factor)
  • 作用:改变相机的视场角(FOV),实现放大/缩小效果。
  • 用法camera.Zoom(1.5) 缩小视场角,放大画面。
  • 默认状态:如果未调用,Zoom 默认值为 1.0,即视场角不变。

(2)方向调整方法

这些方法用于旋转相机,调整相机的视线方向。

1. Azimuth(angle)
  • 作用:围绕世界坐标系的 Z 轴旋转相机。
  • 用法camera.Azimuth(30) 将相机绕 Z 轴旋转 30°。
  • 默认状态:如果未调用,Azimuth 不会改变相机方向。
2. Elevation(angle)
  • 作用:围绕相机自身的 X 轴旋转相机。
  • 用法camera.Elevation(45) 将相机绕自身 X 轴旋转 45°。
  • 默认状态:如果未调用,Elevation 不会改变相机方向。
3. Roll(angle)
  • 作用:围绕相机的视线方向(ViewPlaneNormal)旋转相机。
  • 用法camera.Roll(90) 将相机绕视线方向旋转 90°。
  • 默认状态:如果未调用,Roll 不会改变相机的方向。
4. OrthogonalizeViewUp()
  • 作用:调整 ViewUp 向量,使其与 ViewPlaneNormal 向量正交。
  • 用法camera.OrthogonalizeViewUp()
  • 默认状态:如果未调用,ViewUp 不会自动正交化,可能因旋转操作导致方向混乱。
5. Yaw(angle) 和 Pitch(angle)
  • 作用:类似于 Azimuth() 和 Elevation(),但它们围绕相机自身坐标系的轴旋转。
    • Yaw(angle):围绕相机自身的 Y 轴旋转。
    • Pitch(angle):围绕相机自身的 X 轴旋转。
  • 用法
    camera.Yaw(30)    # 绕 Y 轴旋转 30°
    camera.Pitch(45)  # 绕 X 轴旋转 45°
    
  • 默认状态:如果未调用,这些旋转操作不会影响相机方向。

(3)其他常用功能

1. ComputeViewPlaneNormal()
  • 作用:重新计算视线方向(ViewPlaneNormal)。
  • 用法camera.ComputeViewPlaneNormal()
  • 默认状态:默认情况下,ViewPlaneNormal 会根据 Position 和 FocalPoint 自动计算。
2. SetParallelProjection(state)
  • 作用:设置相机为平行投影模式。
  • 用法camera.SetParallelProjection(1) 开启平行投影,0 为透视投影。
  • 默认状态:默认情况下,相机使用透视投影模式。
3. SetClippingRange(near, far)
  • 作用:设置相机的裁剪范围。
  • 用法camera.SetClippingRange(0.1, 1000)
  • 默认状态:默认裁剪范围为 (0.1, 1000)
4. ResetCamera()
  • 作用:重置相机,使场景中的所有对象都在视野内。
  • 用法renderer.ResetCamera()
  • 默认状态:如果未调用,渲染器不会自动调整相机,可能导致场景不可见。
5. GetViewTransformMatrix()
  • 作用:获取相机的视图变换矩阵。
  • 用法matrix = camera.GetViewTransformMatrix()
  • 默认状态:默认情况下,相机的变换矩阵由其位置、焦点和方向自动计算。

旋转相机 -> 视觉效果上旋转三维vr图像

ren.GetActiveCamera().Azimuth(azimuth_angle)  # 水平旋转
ren.GetActiveCamera().Elevation(elevation_angle)  # 垂直旋转ren.GetActiveCamera().OrthogonalizeViewUp()

在使用 Azimuth() 和 Elevation() 进行组合旋转时,相机会围绕不同的轴旋转:

  • Azimuth():围绕世界坐标系的 Z 轴旋转。
  • Elevation():围绕相机自身的 X 轴旋转。

OrthogonalizeViewUp():确保相机的“上方向”(ViewUp 向量)与相机的视线方向(从相机位置指向焦点的向量)正交

如果不使用OrthogonalizeViewUp():

这些旋转会改变相机的位置和方向,但不会自动调整 ViewUp。如果多次旋转后,ViewUp 和 ViewPlaneNormal 不再正交,会导致以下问题:

  1. 相机方向混乱:相机的“上”方向可能不再符合直觉(例如,图像可能会出现倾斜甚至上下颠倒)。
  2. 视角翻转:当 Elevation() 的角度过大时(例如接近 ±90°),ViewUp 可能会与 ViewPlaneNormal 重合或接近重合,导致视角完全翻转。
  3. 累积误差:每次旋转都会进一步破坏 ViewUp 和 ViewPlaneNormal 的正交性,导致问题越来越严重。

http://www.ppmy.cn/news/1551468.html

相关文章

课题组自主发展了哪些CMAQ模式预报相关的改进技术?

空气污染问题日益受到各级政府以及社会公众的高度重视,从实时的数据监测公布到空气质量数值预报及预报产品的发布,我国在空气质量监测和预报方面取得了一定进展。随着计算机技术的高速发展、空气污染监测手段的提高和人们对大气物理化学过程认识的深入&a…

如何通过ChatGPT提高自己的编程水平

在编程学习的过程中,开发者往往会遇到各种各样的技术难题和学习瓶颈。传统的学习方法依赖书籍、教程、视频等,但随着技术的不断发展,AI助手的崛起为编程学习带来了全新的机遇。ChatGPT,作为一种强大的自然语言处理工具&#xff0c…

一个初始化数据Python脚本

import mysql.connector from mysql.connector import Error from datetime import datetime# 数据库配置 db_config {host: xxx,user: xxx,password: xxx,database: xxx,port: 3306 }# 起始 ID,初始值为你要求的值 current_id 745689123879789456# 生成当前时间 …

unity3d———xml 存储数据例子

1.代码示例: public void SaveData(string fileName){//决定存储路径string path Application.persistentDataPath "/" fileName ".xml";Debug.Log(Application.persistentDataPath);//5个步骤//1.创建我们的Xml文本 XmlDocument xml new…

Apache Flink从Kafka中消费商品数据,并进行商品分类的数量统计题

使用Apache Flink从Kafka中消费商品数据,并进行商品分类的数量统计是一个典型的流处理任务。以下是一个详细的步骤指南和示例代码,帮助你实现这一功能。 ### 前提条件 1. **安装Flink**:确保你的环境中已经安装了 Apache Flink。 2. **安装…

三十一:HTTP多种重定向跳转方式的差异

在现代网站开发中,HTTP 重定向是一种常见的技术,用于将用户的请求从一个 URL 跳转到另一个 URL。重定向机制广泛应用于网站迁移、SEO 优化、以及内容管理系统中。不同的 HTTP 状态码代表不同的重定向方式,每种方式的行为和适用场景各有不同。本文将深入探讨 HTTP 重定向的几…

《数字图像处理基础》学习07-图像几何变换之最近邻插值法放大图像

目录 一,概念 二,题目及matlab实现 1,解题思路 2,matlab实现 1)matlab思路 2)完整代码 三,放大图像及matlab实现 一,概念 通过上一篇,我已经学习了使用最邻近插…

文献hub1:Sequence basis of transcription initiation in the human genome

tip1:文献阅读最重要的就是要抓住QA(要解决的问题)以及文章主线(逻辑) QA其实在abstract以及introduction中可以整理出来, 文章主线(逻辑)主要是看results各小标题每幅图小标题 一…