1. 相机的核心属性
在 VTK 中,vtkCamera
的核心属性有默认值。如果你不设置这些属性,相机会使用默认值来渲染场景。
-
Position
(默认值:(0, 0, 1)
):- 默认情况下,相机位于 Z 轴正方向的
(0, 0, 1)
位置。 - 这是一个距离原点 1 个单位距离的位置。
- 默认情况下,相机位于 Z 轴正方向的
-
FocalPoint
(默认值:(0, 0, 0)
):- 默认焦点是原点
(0, 0, 0)
,相机默认“看向”原点。
- 默认焦点是原点
-
ViewUp
(默认值:(0, 1, 0)
):- 默认“上方向”是 Y 轴正方向
(0, 1, 0)
。
- 默认“上方向”是 Y 轴正方向
-
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
不再正交,会导致以下问题:
- 相机方向混乱:相机的“上”方向可能不再符合直觉(例如,图像可能会出现倾斜甚至上下颠倒)。
- 视角翻转:当
Elevation()
的角度过大时(例如接近 ±90°),ViewUp
可能会与ViewPlaneNormal
重合或接近重合,导致视角完全翻转。 - 累积误差:每次旋转都会进一步破坏
ViewUp
和ViewPlaneNormal
的正交性,导致问题越来越严重。