zoukankan      html  css  js  c++  java
  • VTK 三维场景基本要素:相机

    1.VTK中相机原理及控制属性

    观众的眼睛就好比三维渲染场景中的相机,VTK则是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面,如屏幕、图像等。下图为相机投影示意图:

    从上图可以看出与相机投影相关的因素主要有:
    相机位置:即相机所在的位置,用方法vtkCamera::SetPosition()设置。
    相机焦点:用方法vtkCamera::SetFocusPoint()设置, 默认的焦点位置在世界坐标系的原点。
    朝上方向:即哪个方向为相机朝上的方向。就好比我们直立看东西,方向为头朝上,看到的东西也是直立的,如果我们倒立看某个东西,这时方向为头朝下,看到的东西当然就是倒立的。相机位置、相机焦点和朝上方向三个因素确定了相机的实际方向,即确定相机的视图。
    投影方向:相机位置到相机焦点的向量方向即为投影方向。
    投影方法:确定Actor是如何映射到像平面的。vtkCamera定义了两种投影方法,一种是正交投影(OrthographicProjection),也叫平行投影(Parallel Projection),即进入相机的光线与投影方向是平行的。另一种是透视投影(PerspectiveProjection),即所有的光线相交于一点。
    视角:透视投影时需要指定相机的视角(View Angle),默认的视角大小为30º,可以用方法vtkCamera::SetViewAngle()设置。
    前后裁剪平面:裁剪平面与投影方向相交,一般与投影方向也是垂直的。裁剪平面主要用于评估Actor与相机距离的远近,只有在前后裁剪平面之间的Actor才是可见的。裁剪平面的位置可以用方法vtkCamera::SetClippingRange()设置。

    2.相机使用方法示例

    首先要记住一点的是Camera是Renderer(三维场景)的构成要素。
    如果想获取vtkRenderer里默认的相机,可以用方法vtkRenderer::GetActiveCamera()。
    相机vtkCamera的使用方法:
    1 vtkSmartPointer<vtkCamera>myCamera = vtkSmartPointer<vtkCamera>::New();
    2 myCamera->SetClippingRange(0.0475,2.3786); //这些值随便设置的,东灵提供的
    3 myCamera->SetFocalPoint(0.0573,-0.2134, -0.0523);
    4 myCamera->SetPosition(0.3245,-0.1139, -0.2932);//是否要保证相机位置-焦点向量 与 相机位置-向上方向 正交??
    5 myCamera->ComputeViewPlaneNormal();//重新计算视平面法向量  平行于 相机-焦点
    6 myCamera->SetViewUp(-0.2234,0.9983, 0.0345);
    7 renderer->SetActiveCamera(myCamera); //激活新生成的相机
    上述用SetClippingRange();SetFocalPoint();SetPosition()分别设置相机的前后裁剪平面,焦点和位置。ComputeViewPlaneNormal()方法是根据设置的相机位置、焦点等信息,重新计算视平面(View Plane)的法向量。一般该法向量与视平面是垂直的,如果不是垂直的话,Actor等看起来会有一些特殊的效果,如错切。SetViewUp()方法用于设置相机朝上方向。最后用方法vtkRenderer::SetActiveCamera()把相机设置到渲染场景中。
    vtkCamera除了提供设置与相机投影因素相关的方法之外,还提供了大量的控制相机运动的方法,如:vtkCamera::Dolly(),vtkCamera::Roll(),vtkCamera::Azimuth(),vtkCamera::Yaw(),vtkCamera::Elevation(),vtkCamera::Pitch(),vtkCamera::Zoom()。这些方法具体表示相机是怎么运动,以及相对哪个位置或者方向运动。

    3.相机运动方向示意图

    关于控制相机的运动更详细的方法应该参考Camera说明文档。

    4.相机简单测试

    1     vtkSmartPointer<vtkCamera> mycamera =
    2         vtkSmartPointer<vtkCamera>::New();
    3     mycamera->SetFocalPoint(0,0,0);
    4     mycamera->SetPosition(-5,0,0);
    5     mycamera->SetClippingRange(5.5,6.5);
    6     mycamera->ComputeViewPlaneNormal();
    7     mycamera->SetViewUp(0,1,0);
    8     renderer->SetActiveCamera(mycamera);
    1     vtkSmartPointer<vtkCamera> mycamera =
    2         vtkSmartPointer<vtkCamera>::New();
    3     mycamera->SetFocalPoint(0,0,0);
    4     mycamera->SetPosition(-10,0,0);
    5     mycamera->SetClippingRange(10.5,11.5);
    6     mycamera->ComputeViewPlaneNormal();
    7     mycamera->SetViewUp(0,1,0);
    8     renderer->SetActiveCamera(mycamera);
    1     vtkSmartPointer<vtkCamera> mycamera =
    2         vtkSmartPointer<vtkCamera>::New();
    3     mycamera->SetFocalPoint(0,0,0);
    4     mycamera->SetPosition(-10,0,0);
    5     mycamera->SetClippingRange(5,9);
    6     mycamera->ComputeViewPlaneNormal();
    7     mycamera->SetViewUp(0,1,0);
    8     renderer->SetActiveCamera(mycamera);
    前后裁剪平面不合法。
  • 相关阅读:
    ftp上传下载
    java生成xml
    Java:删除某文件夹下的所有文件
    java读取某个文件夹下的所有文件
    JFileChooser 中文API
    得到java异常printStackTrace的详细信息
    关于SQL命令中不等号(!=,<>)
    ABP前端保存notify提示在Edge浏览器显示null
    关于MY Sql 查询锁表信息和解锁表
    VS2019 backspace键失效,无法使用
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14240979.html
Copyright © 2011-2022 走看看