VTK学习之光照和相机

news/2024/4/17 16:15:15

目录

一、VTK光照

1、关于vtkLight常用的方法

2、最终效果

二、相机设置 

1、相机设置

2、效果


一、VTK光照

通过设置光照,可以达到不同颜色的目的,参考博客:

VTK修炼之道7_三维场景基本要素:光照_vtk 光照_沈子恒的博客-CSDN博客

1、关于vtkLight常用的方法

SetColor() — 设置光照的颜色(一般是设置rgb)

SetPosition() — 设置光照位置

SetFocalPoint() — 设置光照焦点

SetIntensity() — 设置光照的强度

SetSwitch() / SwitchOn()/ SwitchOff()— 打开或关闭对应的光照。

#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkProperty.h>
int main()
{//设置圆vtkSmartPointer<vtkSphereSource> sphere =vtkSmartPointer<vtkSphereSource>::New();sphere->SetCenter(0, 0, 0);sphere->SetRadius(2.0);sphere->SetThetaResolution(15);sphere->SetPhiResolution(15);sphere->Update();//设置mappervtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(sphere->GetOutputPort());//设置actorvtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);//设置vtkRenderervtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();renWin->AddRenderer(renderer);renWin->SetSize(640, 480);renWin->Render();renWin->SetWindowName("Lights");vtkSmartPointer<vtkRenderWindowInteractor> vtkren = vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkren->SetRenderWindow(renWin);vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();vtkren->SetInteractorStyle(style);//添加光照1(绿光)vtkSmartPointer<vtkLight> myLight1 = vtkSmartPointer<vtkLight>::New();myLight1->SetColor(0, 1, 0);myLight1->SetPosition(0, 0, 6);myLight1->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());renderer->AddLight(myLight1);//添加光照2(蓝光)vtkSmartPointer<vtkLight> myLight2 = vtkSmartPointer<vtkLight>::New();myLight2->SetColor(0, 0, 1);myLight2->SetPosition(0, 0, -6);myLight2->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());renderer->AddLight(myLight2);vtkren->Initialize();vtkren->Start();return 0;
}

2、最终效果

二、相机设置 

1、相机设置

相机位置:vtkCamera::SetPosition()或者GetPosition()
相机焦点:GetFocalPoint或者是SetFocalPoint
投影视角:(View Angle),默认的视角大小为30º,GetViewAngle()或者是SetViewAngle()

#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkProperty.h>
int main()
{vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();cone->SetRadius(0.5);cone->SetCenter(0, 0, 0);//设置mappervtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(cone->GetOutputPort());//设置actorvtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);//设置vtkRenderervtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();renWin->AddRenderer(renderer);renWin->SetSize(640, 480);renWin->Render();renWin->SetWindowName("Camera");vtkSmartPointer<vtkRenderWindowInteractor> vtkren = vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkren->SetRenderWindow(renWin);//获取默认相机参数vtkSmartPointer<vtkCamera> activeCamera = renderer->GetActiveCamera();double position[3] = { 0.0,0.0,0.0 };activeCamera->GetPosition(position);cout << "Default position:" << position[0] << "," << position[1] << "," << position[2]<<endl;//0,0,3.2double focalPoint[3] = {0.0,0.0,0.0};activeCamera->GetFocalPoint(focalPoint);cout << "Default Focal Point:" << focalPoint[0] << "," << focalPoint[0] << "," << focalPoint[2] << endl;//0,0,0double viewAngle = activeCamera->GetViewAngle();cout << "viewAngle:"<< viewAngle << endl;//加入自己的相机参数vtkSmartPointer<vtkCamera> myCamera = vtkSmartPointer<vtkCamera>::New();position[0] = 0.0;position[1] = 0.0;position[2] = 1.0;myCamera->SetPosition(position);focalPoint[0] = 0;focalPoint[1] = 0;focalPoint[2] = 0;myCamera->SetFocalPoint(focalPoint);viewAngle = 45.0;myCamera->SetViewAngle(viewAngle);renderer->SetActiveCamera(myCamera);//添加光照1(绿光)vtkSmartPointer<vtkLight> myLight1 = vtkSmartPointer<vtkLight>::New();myLight1->SetColor(0, 1, 0);myLight1->SetPosition(0, 0, 6);myLight1->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());renderer->AddLight(myLight1);vtkren->Initialize();vtkren->Start();return  0;
}

将renderer->SetActiveCamera(myCamera);这句屏蔽,可以看到最初效果如下:

2、效果

放开那句之后,加入自定义相机之后的效果,如下:

本文为作者原创,转载,请标明出处!

推荐博客:精灵球Plus介绍_清风徐来Groot的博客-CSDN博客 

百度云盘:链接:https://pan.baidu.com/s/11b634VvKMIsGdahyBLpZ3Q   提取码:6666 


https://www.xjx100.cn/news/663759.html

相关文章

珂朵莉树ODT(基于std::set的暴力玄学数据结构)

使一整段区间内的东西变得一样&#xff0c;数据随机。 在具有区间赋值操作&#xff0c;区间统计操作&#xff0c;以及最好保证数据随机的情况下在时空复杂度上把线段树吊起来打。 珂朵莉树的各种操作的总体复杂度始终为O(NlogN)&#xff0c;这会吊打某些常数大、附加工作会影…

DDR中的ODT

ODT电阻端接 ODT (on-die termination) 裸片终端&#xff08;ODT&#xff09;功能允许DRAM通过ODT控制引脚为x4 / x8配置的每个DQ&#xff0c;DQS / DQS&#xff0c;RDQS / RDQS和DM信号打开/关闭终端电阻。对于x16配置&#xff0c;ODT通过ODT控制引脚应用于每个DQ&#xff0…

java解析.odt文件

1、了解.odt文件 .odt文件是openoffice软件产生的文档格式&#xff0c;可以直接用office打开&#xff0c;这其实就是一个压缩包&#xff0c;可以使用解压软件打开&#xff0c;里面有一个content.xml文件&#xff0c;这个文件内有<text:p>标签&#xff0c;标签内就是展示出…

DDR中的一些知识点说明(ODT,ZQ校准,OCT,TDQS)

ODT ( On-DieTermination ,片内终结)ODT 也是 DDR2 相对于 DDR1 的关键技术突破,所谓的终结(端接),就是让信号被电路的终端吸 收掉,而不会在电路上形成反射, 造成对后面信号的影响。 顾名思义, ODT 就是将端接电阻移植 到了芯片内部,主板上不再有端接电路。在进入DD…

DDR3系列-ODT-差分电容-容性补偿

DDR3 之 ODT ODT 是 On Die Termination 的缩写&#xff0c;又叫片内端接&#xff0c;顾名思义&#xff0c;就是将外部端接电阻放在了芯片内部&#xff0c;这个功能只有在 DDR2 以上的数据信号才有&#xff0c;DDR没有ODT。 有了这个功能&#xff0c;原本需要在 PCB 板上加串阻…

JESD79-4 第5章 片上终结电阻ODT(5.1-5.3)

DDR4 SDRAM支持ODT功能&#xff0c;此功能可通过ODT引脚控制、写命令或模式寄存器设置默认阻值来调整x4与x8设备的DQ, DQS_t, DQS_c与DM_n信号的终结电阻&#xff0c;x8设备除了上述引脚还可通过MR1.A111调整TDQS_t, TDQS_c的终结电阻。对于x16设备&#xff0c;ODT功能适用于D…

【转】DDR3中的ODT

ODT是什么鬼&#xff1f;为什么要用ODT&#xff1f;在很多关于DDR3的博文和介绍中都没有将清楚。在查阅了很多资料并仔细阅读DDR3的官方标准&#xff08;JESD79-3A&#xff09;之后&#xff0c;总算有点了头绪&#xff0c;下面来整理整理。 1、首先ODT是什么&#xff1f; ODT…

DDR功能点 ODT ZQ校准

ODT 也是 DDR2 相对于 DDR1 的关键技术突破&#xff0c;所谓的终结&#xff08;端接&#xff09;&#xff0c;就是让信号被电路的终端吸收掉&#xff0c;而不会在电路上形成反射&#xff0c; 造成对后面信号的影响。 顾名思义&#xff0c; ODT 就是将端接电阻移植到了芯片内部&…