VTK学习之光照和相机

news2025/2/25 3:34:59

目录

一、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();

	//设置mapper
	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(sphere->GetOutputPort());

	//设置actor
	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);

	//设置vtkRenderer
	vtkSmartPointer<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);

	//设置mapper
	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(cone->GetOutputPort());

	//设置actor
	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);

	//设置vtkRenderer
	vtkSmartPointer<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.2

	double focalPoint[3] = {0.0,0.0,0.0};
	activeCamera->GetFocalPoint(focalPoint);
	cout << "Default Focal Point:" << focalPoint[0] << "," << focalPoint[0] << "," << focalPoint[2] << endl;//0,0,0
	
	double 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.coloradmin.cn/o/619134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吴恩达 ChatGPT Prompt Engineering for Developers 系列课程笔记--02 Guidelines

02 Guidelines 本节将配合代码&#xff0c;介绍一些构建Prompt的基本原则和策略。 1) OpenAI API 首先开发者需要在OpenAI网站(https://platform.openai.com/account/api-keys)注册一个key&#xff0c;然后通过pip install openai安装openai三方库&#xff0c;再将key导入当…

Express路由

一、目标 能够使用express.static()快速托管静态资源能够使用express路由精简项目结构能够使用常见的express中间件能够使用express创建API接口能够在express中启用cors跨域资源共享 二、目录 初始ExpressExpress路由Express中间件使用Express写接口 1.1Express简介 1.什么…

微信小程序原生开发功能合集二十:导航栏、tabbar自定义及分包功能介绍

本章实现导航栏及tabbar的自定义处理的相关方法介绍及效果展示。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.net/course/detail/37977    2. 5…

uCOSii系统的中断管理

uCOSii系统的中断管理 1、在使用uCOSii系统时&#xff0c;中断服务程序需要调用两个函数OSIntEnter()和OSIntExit()。 OSIntEnter() 进入中断时&#xff0c;用OSIntNesting来统计中断嵌套次数&#xff0c;告知uCOSii系统&#xff0c;当前中断服务程序正在执行&#xff1b; OS…

Java实战和面试宝典

这是一篇记录工作和学习过程中遇到的一些问题的文章&#xff0c;每个问题都很有代表性&#xff0c;值得不断回顾和深入思考的&#xff0c;答案未必十分准确&#xff0c;但可以作为一种参考&#xff0c;共勉&#xff01; 读了这篇不一样的八股文&#xff0c;你将至少拥有三年经…

社交媒体品牌:如何通过11个步骤提升您的战略

您是否正在努力在社交媒体上留下自己的印记&#xff1f;您是否觉得您的品牌在无尽的视频和表情包中迷失了方向&#xff1f;在本文中&#xff0c;我们将为您提供11个技巧&#xff0c;帮助您制定社交媒体品牌战略并脱颖而出。但首先&#xff0c;让我们探讨什么是社交媒体品牌&…

正版软件 | DaisyDisk:Mac 电脑一流的磁盘空间管理工具

使用 Mac 工作时&#xff0c;平时创建并下载大量文件&#xff0c;但很容易忘记或者很少删除这些内容。但是有一天&#xff0c;您发现启动磁盘已红&#xff0c;但是自己又好似没有安装啥软件&#xff0c;这时候就会想到底是哪些数据占用了这么大的空间&#xff1f;&#xff01; …

【TA 100】2.3 HLSL常用函数介绍

一、基本数学运算 ● max&#xff08;a&#xff0c;b&#xff09; ○ 返回较大的 ● min&#xff08;a&#xff0c;b&#xff09; ○ 返回较小的 ● mul&#xff08;a&#xff0c;b&#xff09; ○ 两向量相乘&#xff0c;常用于矩阵运算 ● abs&#xff08;a&#xff09; ○ …

ThreeJS教程:地图案例(包围盒、正投影)

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 地图案例(包围盒、正投影) 地图案例(包围盒、正投影) 地图案例会涉及到几何体、包围盒、正投影相机三方面知识点。 平面填充几何体ShapeGeometry包围盒Box3正投影相机Orthograph…

MTK开发板-4G/5G联发科开发板相关方案定制

开发板是用于嵌入式系统开发的电路板&#xff0c;包括中央处理器、存储器、输入设备、输出设备、数据通路 / 总线和外部资源接口等一系列硬件组件。一般来说&#xff0c;开发板由嵌入式系统开发者根据开发需求自主定制&#xff0c;也可以由用户自己研究设计。开发板不仅是初学者…

进阶篇丨链路追踪(Tracing)很简单:链路成本指南

广义上的链路成本&#xff0c;既包含使用链路追踪产生的数据生成、采集、计算、存储、查询等额外资源开销&#xff0c;也包含链路系统接入、变更、维护、协作等人力运维成本。为了便于理解&#xff0c;本小节将聚焦在狭义上的链路追踪机器资源成本&#xff0c;人力成本将在下一…

十二、光照基础

第一部分概念 OpenGL ES的基础光照模型&#xff0c;目前opengl还无法模拟现实世界的复杂光照效果&#xff0c;但是为了效果上的逼真&#xff0c;还是引入了一些简单的模型来模拟光照效果&#xff0c; 这里介绍冯氏光照模型(Phong Lighting Model)模型&#xff0c;他是由三种元…

大数据:spark RDD编程,构建,RDD算子,map,flatmap,reduceByKey,mapValues,groupBy,

大数据&#xff1a;spark RDD编程 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其s…

618有什么数码好物值得购买?2023值得入手的数码好物推荐

在618期间&#xff0c;有哪些值得入手的数码好物&#xff1f;很多人还不知道有哪些数码好物值得买的&#xff0c;本文推荐几款质量不错数码好物&#xff0c;助您尽情享受618购物买买买。 一、南卡OE不入耳蓝牙耳机 推荐理由&#xff1a; 南卡OE耳机是一款性价比超高的不入耳蓝…

进公司第一天当老板问:“测得怎么样了?”我懵逼了

当我入行做测试头两份年&#xff0c;觉的测试工作有时候似乎挺苦逼的&#xff0c;我太难了…… 前言 说实话&#xff0c;我真想从上面去掉"似乎"两个字&#xff0c;软件测试人&#xff0c;就是苦逼&#xff01;有的人曾抱怨过开发很糟糕&#xff0c;但我们没办法要求…

用AI生成思维导图的方法

写在前边&#xff1a; 这篇文章很简单&#xff0c;只为给自己做个记录。并且做一个简单的思考&#xff1a;明明很容易的东西&#xff0c;一旦陷入了思维困境中&#xff0c;就无法找到出去的路。这时候需要扩展思维或者他人提点。 正文&#xff1a; 就挺尴尬&#xff0c;之前…

计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现

文章目录 导文文章重点前言课题内容相关技术与方法介绍技术分析技术设计技术设计技术实现方面系统测试和优化总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现 文章重点 前言 本文介绍了一种基于Python的农业温室智…

玩过Tauri和Electron,最终我选择Flutter进行跨平台应用开发

Flutter、Tauri 和 Electron 都是现代桌面应用程序开发的流行选择&#xff0c;每种技术有其独特的优缺点&#xff0c;下面我们就来对它们进行一个全面的技术对比。 一、Flutter Flutter 是 Google 推出的一款开源的 UI 工具包&#xff0c;用于构建高性能、高保真度的移动、We…

2023年6月杭州/广州/深圳NPDP产品经理认证找这里

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

从搜索电商,社交电商到兴趣电商如何进化

【搜索电商】需求>联结>信任 淘宝、天猫、京东这些是属于什么电商&#xff1f; 答&#xff1a;这些都是属于搜索电商。 某宝&#xff0c;某东等用户有需求&#xff0c;才能产生主动寻找商品的触点&#xff0c;由第三方担保&#xff0c;产生信任。 试想一下&#xff0c;我…