VTK的基本概念

三维场景的基本要素

1.灯光

在三维渲染场景中,可以有多个灯光的存在,灯光和相机是三维渲染场景的必备要素,如果没有指定的话,vtkRenderer会自动创建默认的灯光和相机。在VTK里用类vtkLight来表示渲染场景中的灯光,与现实中的灯光类似,VTK中的vtkLight实例也可以打开、关闭,设置灯光的颜色,照射位置(焦点)、灯光所在的位置、强度等。
vtkLight可以分为位置灯光(也叫聚光灯)和方向灯光。

位置灯光:即光源位置在渲染场景中的某个位置,可以指定灯光的衰减值、锥角等;
方向灯光:即指光源位置在无穷远,可以认为光线是平行的,比如自然界中的太阳光。光源的位置和焦点的连线定义光线的方向。默认的vtkLight为方向灯光。

vtkLight提供了一系列方法来设置光源的位置、颜色、类型和强度等。以下是 vtkLight 的一些常用方法。
位置与方向:

SetPosition(double x, double y, double z):设置光源的位置。
GetPosition():获取光源的位置,返回一个三元组(x, y, z)。
SetFocalPoint(double x, double y, double z):设置光源的焦点位置,即光线指向的方向。
GetFocalPoint():获取光源的焦点位置。

颜色与亮度:

SetColor(double r, double g, double b):设置光源的颜色,参数为 RGB 值(范围 0-1)。
GetColor():获取光源的颜色,返回 RGB 三元组。
SetIntensity(double intensity):设置光源的亮度(强度),值范围通常为 0 到 1。
GetIntensity():获取光源的亮度(强度)值。

光源类型:

SetLightTypeToHeadlight():将光源类型设置为“头灯”,光源总是朝向相机,无论位置如何变化。
SetLightTypeToCameraLight():将光源类型设置为“相机光源”,光源位置与相机位置一致,随相机移动。
SetLightTypeToSceneLight():将光源类型设置为“场景光源”,光源位于场景中的固定位置。
GetLightType():获取当前光源的类型。

衰减:

SetAttenuationValues(double constant, double linear, double quadratic):设置光源的衰减系数,分别控制常数、线性和二次衰减因子。
GetAttenuationValues():获取光源的衰减系数。

开关控制:

SwitchOn() / SwitchOff():开启或关闭光源。
SetSwitch(bool on):直接设置光源是否开启,true 表示开启,false 表示关闭。
GetSwitch():获取光源的开关状态,返回布尔值。

阴影设置:

SetShadowAttenuation(double attenuation):设置光源阴影的衰减值,用于控制阴影的强度。
GetShadowAttenuation():获取阴影的衰减值。

其他常用方法:

DeepCopy(vtkLight *light):复制另一个光源的属性到当前光源。
SetConeAngle(double angle):设置聚光灯的角度,仅在聚光灯模式下生效。
SetExponent(double exponent):设置聚光灯的光强指数,指数越大,光照越集中。

以下是一个使用 vtkLight 的示例,展示了如何在 VTK 场景中创建和设置光源的属性。该示例创建了一个简单的场景,包括一个立方体和一个自定义光源,并演示如何设置光源的位置、颜色、类型等。

#include <vtkSmartPointer.h>
#include <vtkCubeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkLight.h>

QtVTKDemo::QtVTKDemo(QWidget *parent)
    : QMainWindow(parent)
{
   
   
    ui.setupUi(this);

    this->setFixedSize(800, 600);

    QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
  
    // 创建渲染器、渲染窗口和交互器
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    // 创建一个立方体
    vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New();

    // 创建映射器并连接立方体数据
    vtkSmartPointer<vtkPolyDataMapper> cubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    cubeMapper->SetInputConnection(cubeSource->GetOutputPort());

    // 创建演员并设置映射器
    vtkSmartPointer<vtkActor> cubeActor = vtkSmartPointer<vtkActor>::New();
    cubeActor->SetMapper(cubeMapper);

    // 将立方体添加到渲染器中
    renderer->AddActor(cubeActor);

    // 创建光源
    vtkSmartPointer<vtkLight> light = vtkSmartPointer<vtkLight>::New();

    // 设置光源的位置、焦点、颜色和亮度
    light->SetPosition(1.0, 1.0, 1.0);      // 设置光源位置
    light->SetFocalPoint(0.0, 0.0, 0.0);    // 设置光源焦点,使光源指向立方体中心
    light->SetColor(1.0, 1.0, 1.0);         // 设置光源颜色为白色
    light->SetIntensity(0.8);               // 设置光源强度为0.8

    // 设置光源类型为场景光源(固定在场景中的位置,不随相机移动)
    light->SetLightTypeToSceneLight();
    
    // 将光源添加到渲染器
    renderer->AddLight(light);

    // 设置渲染器背景颜色
    renderer->SetBackground(0.1, 0.1, 0.1); // 深灰色背景
    
    // 开始渲染和交互
    ui.openGLWidget->setRenderWindow(renderWindow);
}

在这里插入图片描述

注意:因为Render里可以有多个灯光,所以VTK提供的接口是AddLight()而不是SetLight()。

2.相机

在VTK中,相机(vtkCamera)是一个用于控制三维场景中视角的对象,相机在VTK的3D渲染中扮演着重要的角色,因为它决定了观察者如何看待场景。相机的位置、朝向和投影方式可以通过vtkCamera类来控制。相机投影示意图如下所示:
在这里插入图片描述
从上图可以看出与相机投影相关的要素主要有以下几个:

相机位置:相机所处的位置,用vtkCamera::SetPosition()方法设置。
相机焦点:用vtkCamera::SetFocusPoint()方法设置,默认的焦点位置在世界坐标系的原点。
朝上方向:朝上方向即哪个方向为相机朝上的方向。就好比直立看东西,方向为头朝上,看到的东西也是直立的。如果倒立看东西,这时方向为头朝下,看到的东西就是倒立的。相机位置、相机焦点和朝上方向三个因素确定了相机的实际方向,即确定相机的视图。
投影方向:相机位置到相机焦点的向量方向即为投影方向。
投影方法:该要素用于确定Actor是如何映射到像平面的。vtkCamera定义了两种投影方法;一种是正交投影,也叫平行投影,即进入相机的光线与投影方向是平行的;另一种是透视投影,即所有光线相交于一点。该投影方法最符合人类眼睛对于景物所产生的近大远小的视觉习惯。
视角:透视投影时需要指定相机的视角(View Angle),默认的视角大小为30度,可以用vtkCamera::SetViewAngle()方法设置。
前后裁剪平面:裁剪平面与投影方向相交,一般与投影方向也是垂直的,裁剪平面主要用于评估Actor与相机距离的远近,只有在前后裁剪平面之间的Actor才是可见的。裁剪平面的位置可以用vtkCamera:SetClippingRange()方法设置。

以下是一个使用 vtkCamera的示例

#include <vtkSmartPointer.h>
#include <vtkCubeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkLight.h>
#include <vtkCamera.h>

QtVTKDemo::QtVTKDemo(QWidget *parent)
    : QMainWindow(parent)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值