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())

版权声明:
作者:玉兰
链接:https://www.techfm.club/p/111706.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>