VTK学习之光照和相机

news/2024/10/22 6:56:45/

目录

一、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 


http://www.ppmy.cn/news/258702.html

相关文章

达梦数据库在不修改SQL的情况下为SQL指定HINT

前言 在Oracle中可以使用outline、SQL PROFILE等手段去在无需修改SQL语句的情况下&#xff0c;来保证SQL执行计划在不同硬件环境下相同&#xff0c;从而保证SQL语句在不同环境的执行效率。那么&#xff0c;在达梦数据库中则可以使用SF_INJECT_HINT系统函数达到类似的效果。 SF…

三元锂SOC-OCV修正

按照以下OCV表制作修正电量&#xff1a; 设计思路&#xff1a; 在5-10&#xff0c;10-15.。。。。。之间认为容量随电压的变化是线性的&#xff0c;在温度-20–10&#xff0c;-10-0&#xff0c;0-10…之间认为容量随温度的变化也是线性的。 //soc 当前SOC //temper…

关于float32与float64

tensorflow默认float32(dtype)&#xff0c;numpy默认float64(np.type)&#xff0c;matlab也是默认double。 如果在特定的编程语言里进行强制转换&#xff0c;最好用他们对应的语句&#xff0c;最好不要强行操作&#xff0c;可能会产生一些问题。对于tensorflow想用float64是真的…

史上最强三千六百道脑筋急转弯(6)

3000—地球上什么地方的出生率最高 答案&#xff1a;产房 3001—小张一直朝北走,走着走着他又没有转身可是却走到了正南方,为什么 答案&#xff1a;他越过北极点在向前走就是南方 3002—为什么现代人越来越言而无信 答案&#xff1a;因为有了电话 3003—一个职业登山运动员什么…

你用过的低代码都装备了这四大引擎吗?

低代码开发是一种通过图形化界面和少量编码来快速构建应用程序的方法。尽管增删改查是低代码开发中常见的基本功能&#xff0c;但仅仅通过这些功能的配置&#xff0c;往往只能实现数据的输入和输出&#xff0c;无法满足实际的业务需求。 增删改查功能主要用于对数据进行操作&a…

美的热水器面板php代码,美的热水器故障代码有哪些?

du845968102 2015-12-08 14:48 美的热水器故障代码 1、E1&#xff1a;点火失败或中途熄火 ①由于火焰检测(反馈电极)感应电流较弱时&#xff0c;判定为燃烧器无火&#xff0c;造成程序中断。此时可检查反馈电极是否处于火焰的高温区&#xff0c;调节反馈电极高度&#xff0c;检…

《信息安全等级保护管理办法》公通字[2007]43号

信息安全等级保护管理办法 《信息安全等级保护管理办法》是为规范信息安全等级保护管理&#xff0c;提高信息安全保障能力和水平&#xff0c;维护国家安全、社会稳定和公共利益&#xff0c;保障和促进信息化建设&#xff0c;根据《中华人民共和国计算机信息系统安全保护条例》…

Java List 怎么赋值给另一个List,用等于号可以吗?

公众号请关注"果酱桑", 一起学习,一起进步! 在Java编程中&#xff0c;List是一种常用的数据结构&#xff0c;它可以用来存储一组元素&#xff0c;而且可以动态地添加、删除和修改元素。但是&#xff0c;在实际应用中&#xff0c;我们经常需要将一个List赋值给另一个…