ResetCameraOrientation 保存、修改和恢复摄像机的精确视角参数

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①相机参数的获取与保存

二:代码及注释

python 复制代码
import vtkmodules.vtkInteractionStyle
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import vtkConeSource
from vtkmodules.vtkRenderingCore import vtkPolyDataMapper, vtkActor, vtkCamera, vtkRenderWindow, \
    vtkRenderWindowInteractor, vtkRenderer
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera
from time import sleep


def comma_separated_list(v, precision=6, width=10):
    res = list()
    for p in v:
        res.append(f'{p:{width}.{precision}f}')
    return ','.join(res)

def get_orientation(render_):
    p = {}
    camera = render_.GetActiveCamera()
    p['position'] = camera.GetPosition()
    p['focal_point'] = camera.GetFocalPoint()
    p['view_up'] = camera.GetViewUp()
    p['distance'] = camera.GetDistance()
    p['clipping_range'] = camera.GetClippingRange()
    p['orientation'] = camera.GetOrientation()
    return p

def set_orientation(ren, p):
    """
    Set the orientation of the camera.
    :param ren: The renderer.
    :param p: The orientation parameters.
    :return:
    """
    camera = ren.GetActiveCamera()
    camera.SetPosition(p['position'])
    camera.SetFocalPoint(p['focal_point'])
    camera.SetViewUp(p['view_up'])
    camera.SetDistance(p['distance'])
    camera.SetClippingRange(p['clipping_range'])



def main():
    """
    下列代码中多次出现ren_win.Render() 它的主要作用是触发渲染窗口的绘图过程
    在3D渲染中,执行一次 Render() 命令意味着让 VTK 检查所有渲染器、摄像机和3D对象,然后根据最新的状态将最终图像绘制到屏幕上
    """

    colors = vtkNamedColors()

    cone = vtkConeSource()
    cone.SetHeight(3.0)
    cone.SetRadius(1.0)
    cone.SetResolution(10)
    cone.Update()

    cone_mapper = vtkPolyDataMapper()
    cone_mapper.SetInputConnection(cone.GetOutputPort())

    cone_actor = vtkActor()
    cone_actor.SetMapper(cone_mapper)
    cone_actor.GetProperty().SetColor(colors.GetColor3d("Bisque"))

    ren = vtkRenderer()
    ren.AddActor(cone_actor)
    ren.SetBackground(colors.GetColor3d("MidnightBlue"))

    ren_win = vtkRenderWindow()
    ren_win.AddRenderer(ren)
    ren_win.SetSize(600, 600)
    ren_win.SetWindowName("ResetCameraOrientation")

    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(ren_win)

    style = vtkInteractorStyleTrackballCamera()
    iren.SetInteractorStyle(style)

    camera = ren.GetActiveCamera()
    camera.SetRoll(15)  # 横向旋转角15°
    camera.Elevation(-15)  # 俯仰角-15°
    camera.Azimuth(30)  # 绕着世界坐标系的Y轴旋转30°
    ren.ResetCamera()

    ren_win.Render()
    original_orient = get_orientation(ren)
    s = f'{"Original orientation:":23s}'
    s += comma_separated_list(original_orient["orientation"])
    print(s)
    sleep(1)

    camera.SetPosition(-3.568189, 5.220048, 2.352639)
    camera.SetFocalPoint(-0.399044, -0.282865, 0.131438)
    camera.SetViewUp(0.623411, 0.573532, -0.531431)
    camera.SetDistance(6.727500)
    camera.SetClippingRange(3.001430, 11.434082)

    ren_win.Render()
    new_orient = get_orientation(ren)
    s = f'{"New orientation:":23s}'
    s += comma_separated_list(new_orient["orientation"])
    print(s)
    sleep(1)

    print('Reloading the original orientation.')
    set_orientation(ren, original_orient)
    ren_win.Render()
    check = get_orientation(ren)
    s = f'{"Final orientation:":23s}'
    s += comma_separated_list(check["orientation"])
    print(s)
    sleep(1)

    iren.Initialize()
    iren.Start()

if __name__ == '__main__':
    main()
相关推荐
学掌门4 分钟前
超级菜鸟怎么学习数据分析?
python·学习·数据分析
鸿芯微控科技19 分钟前
压电纳米定位分辨率怎么测?噪声、带宽、最小可检测位移与Python分析
开发语言·python·噪声分析·压电执行器·纳米定位·位移测量
用户77833661321125 分钟前
从 0 搭一个关键词排名监控:核心思路 + 可运行代码
后端·python·api
Fanta丶25 分钟前
14.Python闭包、装饰器
python
码云骑士39 分钟前
99-混合搜索Hybrid-Search-BM25-稀疏稠密向量-融合排序
python
金銀銅鐵1 小时前
[Python] 借助 Turtle 逐字展示《醉翁亭记》
python
用户7088769039382 小时前
给传统 SaaS 增加 AI 能力:3个真实落地场景
python
卷无止境2 小时前
FastAPI中间件全解析:请求处理链条上的隐形关卡
后端·python·fastapi
用户0332126663672 小时前
使用 Python 将 HTML 内容添加到 PowerPoint 演示文稿中
python·html