• VTK 对 camera 的操作方法如下


    对 camera 的操作方法如下: 

    1 vtkCamera *aCamera = vtkCamera::New(); 
    2 aCamera->SetViewUp (0, 0, -1);//设视角位置 
    3 aCamera->SetPosition (0, 1, 0);//设观察对象位
    4 aCamera->SetFocalPoint (0, 0, 0);//设焦点 
    5 aCamera->ComputeViewPlaneNormal();//自动
    6 aRenderer->SetActiveCamera(aCamera);

    1.SetClippingPlane
    设置相机照摄方向的最近端和最远端切片距离。感觉参数像是平行光投影到体数据上前面一片和最后一片的位置信息。(世界坐标系表示)渲染时好像把平面外的数据剪掉了。

    2.SetFocalPoint /SetPosition
    (世界坐标系),控制相机距离。

    3.ComputeViewPlaneNormal
    重置视平面法向,基于当前的位置和焦点。否则会出现斜推剪切效果。

    4.SetViewUp
    设置摄像机的向上的方向。

    5.Zoom
    通过改变视角的方法放大对象。

    6.SetViewAngle
    设置摄像机的视角,默认角度为30度,如果为平行投影则该角度无效。
    通常完美视角计算=2*atan((h/2)/d) ,h是renderwindow的高度,d是眼睛到屏幕的距离。
    OrthogonalizeViewup()--设置正交角度。

    7.修改摄像机位置
    设置好焦点后通过Azimuth()修改方位角和Elevation()修改摄像机位置。使摄像机围绕焦点在球形纬度上运动。例子:

    1 Azimuth(150)//表示 camera 的视点位置沿顺时针旋转 150 度角 
    2 Elevation(60)// 表示 camera 的视点位置沿向上的方面旋转 60 度角

    初始化相机

    1 vtkCamera* cam1 = vtkCamera::New();
    2 cam1->SetClippingRange(0.0475572, 2.337786);                //参数分别为沿着视向的近、远剪切面的距离
    3 cam1->SetFocalPoint(0.052665, -0.129454, -0.0573973);       //焦点:世界坐标系,控制相机方向
    4 cam1->SetPosition(0.327637, -0.116299, -0.256418);          //位置:世界坐标系,设置相机位置
    5 cam1->ComputeViewPlaneNormal();                             //重置视平面法向,基于当前的位置和焦点。否则会出现斜推剪切效果
    6 cam1->SetViewUp(-0.0225386, 0.999137, 0.034901);            //设置相机的“上”方向
    7 ren1->SetActiveCamera(cam1);                                //设置渲染器的相机

    设置已有的相机

    1 cam1 = ren1->GetActiveCamera();                                    //获取渲染器的相机
    2 cam1->Zoom(1.4);                                                   //放大相机,通过改变视角(SetViewAngle()),

    另外,也可以使用Dolly()方法沿着视平面法向移动相机,实现放大或缩小可见角色物体。
    基于焦点,使用Azimuth()和Elevation()方法设置相机的方位角和高度角/仰角(度,degree)[球坐标系统]。
    注意其中在南极和北极存在奇异点,即视向量平行于视平面法向。此时可以使用OrthogonalizeViewUp()方法强制其正交。但这会改变相机坐标系统。
    正交投影vs透视投影

    vtkCamera::ParallelProjectionOn()开启平行/正交投影。此时需通过SetParallelScale()方法控制角色物体的缩放。Zoom不再有效。
  • 相关阅读:
    【Mybatis】使用sql标签封装可复用SQL片段,使用include标签对其进行调用
    【Mybaits】如何在xxMapper.xml中的SQL语句里加入代码注释
    推理(Inference)与预测(Prediction)
    Lombok
    科普 | 深度学习训练和推理有何不同?
    什么是JavaBean,JavaBean作用
    虚函数可以用inline吗?
    python语言版(代码):计算百分数的概率单位
    【转载】百分数的概率单位变换——解惑:概率确实没有单位但是数学里面确实有“概率单位”这个词
    ppt小技巧
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13946946.html
Copyright © 2020-2023  润新知