第05章 14 绘制人脸部的PolyData并使用小圆锥体来展现法线
在VTK中,绘制人脸部的PolyData并使用小圆锥体来展现法线是一个常见的任务。这个过程可以通过以下步骤实现:
- 读取人脸部的PolyData:可以使用VTK的读取模块读取一个包含人脸部的
.vtk或.obj文件。 - 计算法线:使用VTK的
vtkPolyDataNormals类为每个面片(face)或顶点(vertex)计算法线。 - 创建小圆锥体:使用
vtkConeSource创建小圆锥体。 - 生成法线的可视化:使用
vtkGlyph3D将小圆锥体与法线关联,并在每个顶点绘制一个圆锥体,方向与法线一致。
下面是一个完整的C++/VTK示例代码,演示如何实现这一过程:
示例代码
#include <vtkSmartPointer.h>
#include <vtkPolyDataReader.h>
#include <vtkPolyDataNormals.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkConeSource.h>
#include <vtkGlyph3D.h>
#include <vtkNamedColors.h>int main(int argc, char *argv[])
{// 检查输入文件if (argc < 2){std::cerr << "Usage: " << argv[0] << " <FacePolyDataFile>" << std::endl;return EXIT_FAILURE;}// 读取人脸部的PolyData文件vtkSmartPointer<vtkPolyDataReader> reader = vtkSmartPointer<vtkPolyDataReader>::New();reader->SetFileName(argv[1]);reader->Update();vtkSmartPointer<vtkPolyData> polyData = reader->GetOutput();// 计算法线vtkSmartPointer<vtkPolyDataNormals> normals = vtkSmartPointer<vtkPolyDataNormals>::New();normals->SetInputData(polyData);normals->ComputePointNormalsOn(); // 计算顶点法线normals->SplittingOff(); // 不分割面片normals->Update();// 获取法线vtkSmartPointer<vtkPolyData> polyDataWithNormals = normals->GetOutput();// 创建小圆锥体源vtkSmartPointer<vtkConeSource> coneSource = vtkSmartPointer<vtkConeSource>::New();coneSource->SetHeight(0.05); // 圆锥体高度coneSource->SetRadius(0.02); // 圆锥体底部半径coneSource->SetResolution(20); // 圆锥体的分辨率coneSource->Update();// 使用Glyph3D将圆锥体与法线关联vtkSmartPointer<vtkGlyph3D> glyph3D = vtkSmartPointer<vtkGlyph3D>::New();glyph3D->SetInputData(polyDataWithNormals);glyph3D->SetSourceConnection(coneSource->GetOutputPort());glyph3D->SetVectorModeToUseNormal(); // 使用法线作为方向glyph3D->SetScaleFactor(0.5); // 设置圆锥体的大小glyph3D->Update();// 创建映射器vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(glyph3D->GetOutputPort());// 创建演员vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);// 创建渲染器、渲染窗口和交互器vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 添加演员到渲染器renderer->AddActor(actor);renderer->SetBackground(0.1, 0.2, 0.4); // 设置背景颜色// 渲染和启动交互renderWindow->Render();interactor->Start();return EXIT_SUCCESS;
}
代码说明
-
读取人脸部的PolyData:
- 使用
vtkPolyDataReader读取一个包含人脸部的PolyData文件(例如.vtk或.obj格式)。
- 使用
-
计算法线:
- 使用
vtkPolyDataNormals计算顶点法线,并通过ComputePointNormalsOn()开启顶点法线计算。
- 使用
-
创建小圆锥体:
- 使用
vtkConeSource创建一个小圆锥体,设置高度(Height)和底部半径(Radius),并设置分辨率(Resolution)。
- 使用
-
使用Glyph3D生成法线可视化:
- 使用
vtkGlyph3D将小圆锥体与法线关联,设置SetVectorModeToUseNormal()以使用法线方向,并通过SetScaleFactor()调整圆锥体的大小。
- 使用
-
创建映射器和演员:
- 使用
vtkPolyDataMapper将生成的数据映射到演员,并将演员添加到渲染器中。
- 使用
-
渲染和交互:
- 创建渲染窗口和交互器,并启动渲染循环。
示例输入和输出
输入
- 一个包含人脸部的
.vtk或.obj文件。例如,你可以使用一个简单的OBJ文件或VTK文件,其中包含一个人脸的网格数据。
输出
- 一个窗口,显示人脸部的网格,并在每个顶点绘制一个小圆锥体,圆锥体的方向与该顶点的法线方向一致。
运行示例
编译并运行此代码时,需要提供一个人脸的PolyData文件作为输入。例如:
./FaceNormalsVisualization face.vtk
注意事项
- 文件格式:确保输入文件是VTK支持的格式(例如
.vtk或.obj)。 - 圆锥体大小:可以通过调整
SetScaleFactor()的值来控制圆锥体的大小。 - 法线计算:如果法线方向不正确,可以尝试调整
vtkPolyDataNormals的参数,例如反转法线方向。
相关文章:
第05章 14 绘制人脸部的PolyData并使用小圆锥体来展现法线
在VTK中,绘制人脸部的PolyData并使用小圆锥体来展现法线是一个常见的任务。这个过程可以通过以下步骤实现: 读取人脸部的PolyData:可以使用VTK的读取模块读取一个包含人脸部的.vtk或.obj文件。计算法线:使用VTK的vtkPolyDataNorm…...
基于微信小程序的电子商城购物系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
2000-2020年各省第二产业增加值占GDP比重数据
2000-2020年各省第二产业增加值占GDP比重数据 1、时间:2000-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区名称、年份、第二产业增加值占GDP比重 4、范围:31省 5、指标解释:第二产业增加值占GDP比重…...
【Docker】Docker入门了解
文章目录 Docker 的核心概念Docker 常用命令示例:构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么?****为什么 C 开发者需要 Docker?** **二、核心概…...
【C语言分支与循环结构详解】
目录 ---------------------------------------begin--------------------------------------- 一、分支结构 1. if语句 2. switch语句 二、循环结构 1. for循环 2. while循环 3. do-while循环 三、嵌套结构 结语 -----------------------------------------end----…...
java求职学习day18
常用的设计原则和设计模式 1 常用的设计原则(记住) 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 (1)开闭原则(Open Close Principle…...
初阶2 类与对象
本章重点 上篇1.面向过程和面向对象初步认识2.类的引入---结构体3.类的定义3.1 语法3.2 组成3.3 定义类的两种方法: 4.类的访问限定符及封装4.1 访问限定符4.2封装---面向对象的三大特性之一 5.类的作用域6.类的实例化7.类对象模型7.1 如何计算类对象的大小 8.this指…...
蓝桥杯模拟算法:多项式输出
P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题,我们需要分情况讨论,我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…...
Python的那些事第三篇:Python编程的“调味料”与“交流术”运算符与输入输出
运算符与输入输出:Python编程的“调味料”与“交流术” 在编程的世界里,Python不仅仅是一门语言,它更像是一位充满智慧的厨师,而运算符和输入输出则是它手中的“调味料”和“交流术”。没有这些工具,代码就会像没有加…...
如何利用AI工具来进行数据分析
利用AI工具进行数据分析可以显著提高效率和准确性,以下是详细步骤和方法: 1. 明确分析目标 在开始数据分析之前,首先需要明确分析的目标和问题。这包括确定需要解决的问题、期望的见解或结果,以及选择合适的AI工具和方法。 2. …...
深度剖析C++17中的std::optional:处理可能缺失值的利器
文章目录 一、基本概念与设计理念二、构建与初始化(一)默认构造(二)值初始化(三)使用std::make_optional(四)使用std::nullopt 三、访问值(一)value()&#x…...
MySQL用户授权、收回权限与查看权限
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...
每日一题 429. N 叉树的层序遍历
429. N 叉树的层序遍历 /*class Solution { public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> que;que.push(root);vector<vector<int>> ans;if(root nullptr){return ans;}while(!que.empty()){int sizeQue que.size();vec…...
【Maui】注销用户,采用“手势”点击label弹窗选择
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 方法一:前端绑定3.2 方法二:后端绑定3.3 注销用户的方法 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创…...
如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt
文章目录 xps转txt方法一方法二 pdf转txt整页转txt提取pdf表格,并转为txt 总结另外参考XPS文件转换为TXT文件XPS文件转换为PDF文件PDF文件转换为TXT文件提取PDF表格并转为TXT示例代码(部分) 本文测试代码已上传,路径如下ÿ…...
Object类(2)
大家好,今天我们继续来看看Object类中一些成员方法,这些方法在实际中有很大的用处,话不多说,来看。 注:所有类都默认继承Object类的,所以可调用Object类中的方法,如equals,也可以发生…...
BGP分解实验·11——路由聚合与条件性通告(3)
续接上(2)的实验。其拓扑如下: 路由聚合的负向也就是拆分,在有双出口的情况下,在多出口做流量分担是优选方法之一。 BGP可以根据指定来源而聚合路由,在产生该聚合路由的范围内的条目注入到本地BGP表后再向…...
无用的知识又增加了:is_assignable means?
std::pair的默认operator被delete掉了,取而代之的是两个enable_if版本。 为什么这么设计,我的理解是在std::map里,已经保存的元素的key值是不能被修改的,比如 注意,下面的代码会修改key值,编译时出现错误…...
MOS的体二极管能通多大电流
第一个问题:MOS导通之后电流方向可以使任意的,既可以从D到S,也可以从S到D。 第二个问题:MOS里面的体二极管电流可以达到几百安培,这也就解释了MOS选型的时候很少考虑体二极管的最大电流,而是考虑DS之间电流…...
C语言【基础篇】之流程控制——掌握三大结构的奥秘
流程控制 🚀前言🦜顺序结构💯 定义💯执行规则 🌟选择结构💯if语句💯switch语句💯case穿透规则 🤔循环结构💯for循环💯while循环💯do -…...
Node.js下载安装及环境配置教程 (详细版)
Node.js:是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建可扩展的网络应用程序。Node.js 使用事件驱动、非阻塞 I/O 模型,使其非常适合构建实时应用程序。 Node.js 提供了一种轻量、高效、可扩展的方式来构建网络应用程序࿰…...
【PySide6拓展】QCalendarWidget 日历控件
文章目录 PySide6拓展:QCalendarWidget 日历控件前言什么是QCalendarWidget?特点: 如何使用QCalendarWidget?1. 基本用法2. 获取当前选中的日期 QCalendarWidget 常用函数分类介绍1. 日期选择与管理函数2. 日期格式与显示函数3. 日…...
新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战
生成式人工智能的发展既带来了有益的生产力转型机会,也提供了被恶意利用的机会。 最近,Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT,是人工智能用于非法活动的新前沿,可以被用于网…...
【文星索引】搜索引擎项目测试报告
目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…...
【PostgreSQL内核学习 —— (WindowAgg(一))】
WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊…...
Maya快捷键
旋转 ALT鼠标左键 平移 ALT鼠标中键 缩放 ALT鼠标右键 / 滑动鼠标滚轮 切换视图 空格键 [Q] 选择状态 [W] 移动状态 [E] 旋转状态 [R] 绽放状态 1正常显示 2正常也圆滑同时显示 3圆滑显示 4线框显示 5材质显示 6贴图显示 7灯光显示 CTRLZ 撤销命令…...
Go反射指南
概念: 官方对此有个非常简明的介绍,两句话耐人寻味: 反射提供一种让程序检查自身结构的能力反射是困惑的源泉 第1条,再精确点的描述是“反射是一种检查interface变量的底层类型和值的机制”。 第2条,很有喜感的自嘲…...
深入理解 C 语言函数指针的高级用法:(void (*) (void *)) _IO_funlockfile
深入理解 C 语言函数指针的高级用法 函数指针是 C 语言中极具威力的特性,广泛用于实现回调、动态函数调用以及灵活的程序设计。然而,复杂的函数指针声明常常让即使是有经验的开发者也感到困惑。本文将从函数指针的基本概念出发,逐步解析复杂…...
【观察】甲骨文:以AI为中心,开启企业级平台架构“新革命”
知名科技杂志《连线》创始主编凯文凯利曾预测:“在未来的 100 年里,人工智能将超越任何一种人工力量,将人类引领到一个前所未有的时代。” 可以看到,随着近两年AIGC与大模型的快速爆发,AI在千万行业中的重要性愈发突出…...
react native在windows环境搭建并使用脚手架新建工程
截止到2024-1-11,使用的主要软件的版本如下: 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…...
