首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

VTK中对于相机camera的设置

  • 25-03-02 08:01
  • 3069
  • 7243
blog.csdn.net

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 轴旋转。
  • 用法:
    1. camera.Yaw(30) # 绕 Y 轴旋转 30°
    2. 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图像

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

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

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

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

如果不使用OrthogonalizeViewUp():

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

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

renWin.Render() 不一定需要反复更新

renWin.Render() 是 VTK 中用于触发渲染窗口更新的关键方法。

eg:,注释掉旋转相机后的renWin.Render()。后续窗口捕获仍能正确捕获到旋转后的图像,并且注释掉renWin.Render()响应速度大幅提升。

A:

旋转相机的代码如下:

  1. ren.GetActiveCamera().Azimuth(azimuth_angle)
  2. ren.GetActiveCamera().Elevation(elevation_angle)
  3. ren.GetActiveCamera().OrthogonalizeViewUp()

这几行代码直接修改了相机的属性(如方位角和俯仰角)。在 VTK 的内部实现中,相机的这些属性是直接作用于渲染器(vtkRenderer)的。也就是说,虽然没有调用 renWin.Render(),相机的状态已经被更新了。

以下代码来捕获窗口内容:

  1. windowToImageFilter.SetInput(renWin)
  2. windowToImageFilter.Update()
关键点:vtkWindowToImageFilter 的行为
  • vtkWindowToImageFilter 是一个特殊的过滤器,当你调用 SetInput(renWin) 和 Update() 时,VTK 会在内部确保渲染窗口的内容是最新的。
  • 如果渲染窗口的内容过期(例如相机或场景发生了变化),vtkWindowToImageFilter 会自动触发一次隐式的渲染过程,以确保捕获的图像是最新的。
  • 因此,即使你没有显式调用 renWin.Render(),vtkWindowToImageFilter.Update() 可能会在后台完成了渲染。
注:本文转载自blog.csdn.net的学無芷境的文章"https://blog.csdn.net/m0_57621770/article/details/144088945"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

138
3C硬件
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top