03-三维场景的基本要素(相机)

一、相机

观众的眼睛好比三维渲染场景中的相机,在VTK中用vtkCamera类来表示。vtkCamera负责把三维场景投影到二维平面,如屏幕,相机投影示意图如下图所示。从图中可以看出与相机投影相关的要素主要有如下几个:

1)相机位置。相机所处的位置,用vtkCamera::SetPosition()方法设置。

2)相机焦点。用vtkCamera::SetFocusPoint()方法设置,默认的焦点位置在世界坐标系的原点。

3)朝上方向。朝上方向即哪个方向为相机朝上的方向。就好比直立看东西,方向为头朝上,看到的东西也是直立的,如果倒立看某个东西,这时方向头朝下,看到的东西就是倒立的。相机位置、相机焦点和朝上方向三个因素确定了相机的实际方向,即确定相机的试图。

4)投影方向。相机位置到相机焦点的向量方向即为投影方向。

5)投影方法。该要素用于确定Actor是如何映射到像平面的。vtkCamera定义了两种投影方法:一种是正交投影(Orthographic Projection),也叫平行投影(Parallel Projection),即进入相机的光线与投影方向是平行的;另一种是透视投影(Perspective Projection),即所有光线相较于一点。该投影方法最符合人类眼睛对于景物所产生的近大远小的视觉习惯。

6)视角。透视投影时需要指定相机的视角(View Angle),默认的视角大小为30°,可以用vtkCamera::SetViewAngle()方法设置。

7)前后裁剪平面。裁剪平面与投影方向相交,一般与投影方向也是垂直的。裁剪平面主要用于评估Actor与相机距离的远近,只有在前后裁剪平面之间的Actor才是可见的。裁剪平面的位置可以用vtkCamera::SetClippingRange()方法设置。

二、相机示例

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkProperty.h>

int main(int argc, char *argv[])
{
	//cylinder:圆柱
	vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
	cylinder->SetHeight(3.0);
	cylinder->SetRadius(1.0);
	cylinder->SetResolution(10);

	vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

	vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
	cylinderActor->SetMapper(cylinderMapper);

	vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
	camera->SetClippingRange(0.0475, 2.3786);
	camera->SetFocalPoint(0.0573, -0.2134, -0.0523);
	camera->SetPosition(0.3245, -0.1139, -0.2932);

	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(cylinderActor);
	renderer->SetBackground(1.0, 1.0, 1.0);
	renderer->SetActiveCamera(camera);
	renderer->ResetCamera();	//让action用合适比例显示在窗口

	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(renderer);
	renWin->SetSize(640, 480);
	renWin->Render();
	renWin->SetWindowName("RenderCylinder-Lights");//设置窗口名字

	vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	iren->SetRenderWindow(renWin);

	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	iren->SetInteractorStyle(style);

	iren->Initialize();
	iren->Start();

	return 0;
}

运行:

SetClippingRange():设置相机的前后裁剪平面。
SetFocalPoint():设置相机焦点位置。
SetPosition():设置相机位置。
ComputeViewPlaneNormal():方法是根据设置的相机位置、焦点等信息,重新计算视平面(View Plane)的法向量。
SetViewUp():设置相机朝上方向。

注意:一般该法向量与视平面是垂直的,如果不垂直,Actor等看起来会有一些特殊的效果,如错错切。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三维重建是指利用各种传感器和算法技术来获取目标物体的三维信息,并将其重新建立为具有空间结构的模型。TOF(Time of Flight)相机是一种采用飞行时间原理的传感器,能够实时测量物体与相机之间的距离。 TOF相机成像主要通过发射一束红外光或激光脉冲,利用光传播的飞行时间来计算目标物体到相机的距离。当发射器产生脉冲信号时,光线会经过传播和反射,然后再经过相机的接收器接收。通过测量光线的发射和接收的时间差,可以计算出物体与相机的距离。 三维重建利用TOF相机成像的过程主要包括以下几个步骤:首先,相机发射脉冲光束,经过空气或物体反射后返回到相机接收器;接着,根据发射和接收的时间差,计算出每个像素点对应物体的距离值;然后,通过计算相邻像素点之间的距离关系,可以获得物体的形状和结构信息;最后,根据距离值和像素点的位置,将数据转换为可视化的三维模型。 TOF相机成像在三维重建应用中具有很大的优势,首先,TOF相机可以实时快速地获取物体的距离信息,适用于高速运动物体的测量,也能处理复杂场景。其次,TOF相机具有较高的精度和稳定性,可以提供较为准确的距离测量结果。此外,TOF相机还可以跟踪物体的运动,并实时更新模型,使得三维重建结果更加准确。 综上所述,三维重建利用TOF相机成像技术能够快速、准确地获取物体的三维信息,广泛应用于计算机视觉、虚拟现实、机器人导航等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值