VTK中的三维场景的变换(相机、光源)
1 VTK 中的相机(vtkCamera)的作用和原理:
VTK 相机 基于计算机图形学中的透视投影原理来模拟相机的行为。它定义了一个虚拟相机,可以从不同的角度观察三维场景,并将其投影到屏幕上。
透视投影变换 是一种数学技术,将三维场景中的点转换为屏幕上的二维像素坐标。在透视投影中,相机位于三维空间的某个位置,通过视点(ViewPoint)来定义相机的位置。相机还有一个方向向量,表示相机的观察方向。视点和方向向量共同决定了相机的位置和朝向。
相机的参数:
- Position(相机位置):光心的位置,相当于小孔相机模型中小孔的位置。可以通过 vtkCamera::SetPosition() 和 vtkCamera::GetPosition() 设置和获取。
- Focal Point(相机焦点):焦点的位置,用三维坐标表示,默认相机焦点的位置在世界坐标系的原点。通过vtkCamera::SetFocusPoint() 和 vtkCamera::GetFocusPoint() 设置和获取。
- View Up(相机朝向):ViewUp 指图像的正方向。由 Position 和 Focal Point 确定了相机的实际方向,即确定了相机的视图。
- View Angle(相机视角):视角,默认是 30°。决定了图像的比例大小,通过设置 vtkCamera::SetViewAngle() 可以对图像进行缩放。
- Front Clipping Plane / Back Clipping Plane(前/后裁剪平面):只有在这两个剪切平面之间的内容才会被渲染和显示,默认值是 (0.1, 1000)。
- Direction of Projection(投影方向):一个三维矢量,从光心位置指向焦点位置。它决定了相机的视线方向。
- Azimuth(水平旋转):要将相机水平翻转(绕垂直轴旋转),您可以使用
vtkCamera::Azimuth(180.0)
方法。这将使相机绕其焦点旋转 180 度,从而实现水平翻转。 - Elevation(垂直旋转):要实现相机的垂直翻转(绕水平轴旋转),您可以使用
vtkCamera::Roll(180.0)
方法。这将使相机绕其视线方向旋转 180 度,从而实现垂直翻转。 - Zoom():通过改变视角的方法放大缩小对象。
- ResetCamera(重置相机):自适应
示例代码:
import vtk
def create_camera():
# 创建一个相机
camera = vtk.vtkCamera()
# 设置相机位置
camera.SetPosition(0, 0, 10)
# 设置相机焦点
camera.SetFocalPoint(0, 0, 0)
# 设置相机朝向
camera.SetViewUp(0, 1, 0)
# 设置相机视角
camera.SetViewAngle(30)
# 设置前/后裁剪平面
camera.SetClippingRange(0.1, 1000)
# 在 X 方向上旋转 34 度
camera.Azimuth(34.0)
return camera
if __name__ == "__main__":
# 创建相机
my_camera = create_camera()
# 打印相机参数
print("Camera Position:", my_camera.GetPosition())
print("Camera Focal Point:", my_camera.GetFocalPoint())
print("Camera View Up:", my_camera.GetViewUp())
print("Camera View Angle:", my_camera.GetViewAngle())
print("Camera Clipping Range:", my_camera.GetClippingRange())
2 光源 Light
VTK 中的光源(vtkLight)
作用和原理:
vtkLight 用于模拟三维渲染中的光照效果。它提供了定位光源和方向光源的功能,可以控制光照的亮度、颜色和衰减等属性。
在 VTK 中,光源分为两类:
- 位置光源(Positional Light,也称为聚光灯):光源位置在渲染场景中的某个位置。您可以指定光照的衰减值、锥角等。
- 方向光源(Directional Light,也称为平行光):光源位置在无穷远,光线可以认为是平行的,类似自然界中的太阳光。
光源参数:
- 位置(Position):光源的位置,可以通过 vtkLight::SetPosition(x, y, z) 设置。
- 焦点(Focal Point):光线的方向,通过 vtkLight::SetFocalPoint(x, y, z) 设置。
- 环境光颜色(Ambient Color):光源的环境光颜色,通过 vtkLight::SetAmbientColor(r, g, b) 设置。
- 漫反射颜色(Diffuse Color):光源的漫反射颜色,通过 vtkLight::SetDiffuseColor(r, g, b) 设置。
- 镜面反射颜色(Specular Color):光源的镜面反射颜色,通过 vtkLight::SetSpecularColor(r, g, b) 设置。
示例代码:
import vtk
def create_light():
# 创建一个光源
light = vtk.vtkLight()
# 设置光源位置
light.SetPosition(0, 0, 10)
# 设置光源焦点
light.SetFocalPoint(0, 0, 0)
# 设置光源的颜色
light.SetColor(1, 0, 0)
# 设置光源环境光颜色
light.SetAmbientColor(0.2, 0.2, 0.2)
# 设置光源漫反射颜色
light.SetDiffuseColor(1.0, 1.0, 1.0)
# 设置光源镜面反射颜色
light.SetSpecularColor(1.0, 1.0, 1.0)
return light
if __name__ == "__main__":
# 创建光源
my_light = create_light()
# 打印光源参数
print("Light Position:", my_light.GetPosition())
print("Light Focal Point:", my_light.GetFocalPoint())
print("Light Ambient Color:", my_light.GetAmbientColor())
print("Light Diffuse Color:", my_light.GetDiffuseColor())
print("Light Specular Color:", my_light.GetSpecularColor())
共有 0 条评论