首页 > 其他分享 >VTK随笔二:三维场景的基本要素

VTK随笔二:三维场景的基本要素

时间:2024-08-23 13:22:26浏览次数:6  
标签:include 灯光 VTK 投影 相机 基本要素 renderer 随笔 vtkNew

一、灯光

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

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

  • setColor(): 设置灯光的颜色,以RGB的形式指定颜色。
  • setPosition(): 设置光照位置。
  • setFocalPoint(): 设置灯光焦点。
  • setIntensity(): 设置灯光的强度。
  • setSwitch()/SwitchOn()/SwitchOff(): 打开或关闭对应的灯光。

 示例代码:

#include <QApplication>
#include <QVTKOpenGLNativeWidget.h>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCylinderSource.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkLight.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    vtkNew<vtkCylinderSource> cylinder;
    cylinder->SetResolution(8);

    vtkNew<vtkPolyDataMapper> cylinderMapper;
    cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

    vtkNew<vtkActor> cylinderActor;
    cylinderActor->SetMapper(cylinderMapper);
    cylinderActor->GetProperty()->SetColor(1,1,1);
    cylinderActor->RotateX(30.0);
    cylinderActor->RotateY(-45.0);

    vtkNew<vtkRenderer> renderer;
    renderer->AddActor(cylinderActor);
    renderer->SetBackground(1,1,1);
    renderer->ResetCamera();
    renderer->GetActiveCamera()->Zoom(1.5);

    vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
    renderWindow->AddRenderer(renderer);
    QVTKOpenGLNativeWidget w;
    w.setRenderWindow(renderWindow);

    // 定义绿色光,位置在(0,0,1),焦点对着相机的焦点,然后addLight到渲染场景中
    vtkNew<vtkLight> light1;
    light1->SetColor(0,1,0);
    light1->SetPosition(0,0,1);
    light1->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
    renderer->AddLight(light1);

    // 定义蓝色光,位置在(0,0,1),焦点对着相机的焦点,然后addLight到渲染场景中
    vtkNew<vtkLight> light2;
    light2->SetColor(0,0,1);
    light2->SetPosition(0,0,-1);
    light2->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
    renderer->AddLight(light2);

    w.show();
    return a.exec();
}

效果如下: 

二、相机

        观众的眼睛好比三维渲染场景中的相机,在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()方法设置。 

示例代码:

    vtkNew<vtkCamera> myCamera;
    myCamera->SetClippingRange(0.0475, 2.3786);
    myCamera->SetFocalPoint(0.0573, -0.2134, -0.0523);
    myCamera->SetPosition(0.3245, -0.1139, -0.2932);
    myCamera->SetViewUp(-0.2234, 0.9983, 0.0345);
    renderer->SetActiveCamera(myCamera);

vtkCamera除了提供设置于相机投影因素相关的方法之外,还提供了大量的控制相机运动的方法,如Dolly()、Roll()、Azimuth()、Yaw()、Elevation()、Pitch()、Zoom()。 

 三、颜色

颜色是Actor重要的属性之一。VTK采用RGB和HSV两种颜色系统来描述颜色。

四、纹理映射

        纹理映射是创建逼真效果的强大图形工具,其原理是渲染时把二维的图像“贴”到物体的表面上,根据二维图像渲染出丰富多彩的效果,所以也叫纹理贴图。纹理映射需要三个要素:带贴图的表面、纹理映射以及纹理坐标。其中纹理映射在VTK中就是vtkImageData的数据集,而纹理坐标则用于控制纹理图在表面的位置。 

示例代码:

    vtkNew<vtkJPEGReader> reader;
    reader->SetFileName("texture.jpg");
    
    vtkNew<vtkTexture> texture;
    texture->SetInputConnection( reader->GetOutputPort() );
    texture->InterpolateOn();
    
    vtkNew<vtkPlaneSource> plane;
    vtkNew<vtkPolyDataMapper> mapper;
    mapper->SetInputConnection( plane->GetOutputPort() );
    
    vtkNew<vtkActor> actor;
    actor->SetMapper( mapper );
    actor->SetTexture( texture );

标签:include,灯光,VTK,投影,相机,基本要素,renderer,随笔,vtkNew
From: https://blog.csdn.net/u012959478/article/details/141462633

相关文章

  • 随笔-firefox-配置
    内存泄漏https://support.mozilla.org/zh-CN/kb/内存消耗严重#w_zhong-xin-qi-dong-firefoxfirefox浏览器设置书签打开新网址时,想要打开一个新的标签(tab),而不是覆盖掉原来网页,可以这样设置:-地址栏中输入about:config-搜索browser.tabs.loadBookmarksInTabs,会发现值为fa......
  • 2024.8.20随笔
    树分治这部分知识是我的弱项,之前学习时也没有听懂。此前碰到这类题也会想尽办法用数据结构代替,但发现非常不可做,代码复杂程度极高。而且感觉之前我连普通的区间分治都不太熟练,没有学好的信心。现在学习过后好了很多,理解了分治的核心(也许),就是每次到分治的关键点就去统计包含关键点......
  • 银河麒麟V10入门学习随笔(一)
    操作系统:银河麒麟高级服务器操作系统V10  1.前置学习资料1.1.基本的linux的命令~cd:https://blog.csdn.net/2302_76410765/article/details/1297665921.2.防火墙配置指令:https://blog.csdn.net/weixin_43829023/article/details/132623979 2.Todesk远程工具安装2.1.......
  • VTK—vtkImplicitFunction 隐函数
    通过这个例子可以直观理解隐函数是什么、在空间中怎么分布、怎么布尔运算。1.完整代码#include<vtkBox.h>#include<vtkNew.h>#include<vtkActor.h>#include<vtkSphere.h>#include<vtkAutoInit.h>#include<vtkProperty.h>#include<vtkRenderer.h>#include<vtkIm......
  • 2024.8.19随笔
    关于迟到这么多天就迟到一次就被抓了个正着/jk今天刚好错过地铁,后来在地铁上碰见了int08,本来他和我都坐的上一班结果今天都迟到了,然后在路上就一直讨论李老和hfu抓住我们的概率。本来我想今天迟到就算了,毕竟刚好错过地铁下一班要等好一会没办法,但int08认为他有很大概率被抓......
  • python随笔day4
    python实战面试题目1、列出你知道的http协议的状态码,说出表示什么意思?1xx临时响应2xx成功3xx重定向4xx请求错误5xx服务器错误我经常遇到的:200成功、404未找到网页文件、403服务器拒绝请求(禁止)、304未修改(自从上次请求后该网页就未修改过)、500服务器内部错误、503服务器......
  • vtk范围映射 -1 ~ +1 映射到 0 ~ 255
    来源:https://www.ilikebigbits.com/2015_02_05_remap.html inlinefloatremap(floatx,floatin_min,floatin_max,floatout_min,floatout_max){floatt=(x-in_min)/(in_max-in_min);returnlerp(out_min,out_max,t);}......
  • 真随笔
    要想成为优秀的人可真困难啊比如现在我一点都不想看雅思了但是还是要继续看为什么呢因为我想尽量一次考过然后拿到游戏机唉真的很想要游戏机我一点都不想看雅思了但是要要再学一会可能如果不学雅思我也不知道我应该干什么吧总之学习总不会出错的那些个大学霸可真是厉害......
  • 个人随笔
    (一)人追求一种情感方向,对其它的情感方向就没有感觉。例如追求人与人之间的爱,对打来打去的武打片就没有感觉。所以人只能看到自己情感的方面,而对其它情感方面,就算看到了,情感也无法理解,那就等于没有看到。这也说明不同情感方向,是不可能相互影响的。能被影响,说明是同类或相似的情感......
  • Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task3随笔
    目录Task3一、ComfyUI1、初识ComfyUI(1)什么是ComfyUI(2)核心模块(3)生成流程(4)优势2、速通安装ComfyUI(1)下载脚本代码文件(2)进入ComfyUI的安装文件(3)一键执行安装程序(4)进入预览界面3、浅尝ComfyUI工作流(1)不带Lora的工作流样例(2)带Lora的工作流样例4......