美文网首页
VTK中的三维场景的变换(相机、光源)

VTK中的三维场景的变换(相机、光源)

作者: 小黄不头秃 | 来源:发表于2024-03-03 14:45 被阅读0次

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

    相关文章

      网友评论

          本文标题:VTK中的三维场景的变换(相机、光源)

          本文链接:https://www.haomeiwen.com/subject/pnvzadtx.html