VTK中对于相机camera的设置

发布于:2024-11-28 ⋅ 阅读:(10) ⋅ 点赞:(0)

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 的正交性,导致问题越来越严重。