第05章 14 绘制人脸部的PolyData并使用小圆锥体来展现法线

在VTK中,绘制人脸部的PolyData并使用小圆锥体来展现法线是一个常见的任务。这个过程可以通过以下步骤实现:

  1. 读取人脸部的PolyData:可以使用VTK的读取模块读取一个包含人脸部的.vtk.obj文件。
  2. 计算法线:使用VTK的vtkPolyDataNormals类为每个面片(face)或顶点(vertex)计算法线。
  3. 创建小圆锥体:使用vtkConeSource创建小圆锥体。
  4. 生成法线的可视化:使用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;
}


代码说明

  1. 读取人脸部的PolyData

    • 使用vtkPolyDataReader读取一个包含人脸部的PolyData文件(例如.vtk.obj格式)。
  2. 计算法线

    • 使用vtkPolyDataNormals计算顶点法线,并通过ComputePointNormalsOn()开启顶点法线计算。
  3. 创建小圆锥体

    • 使用vtkConeSource创建一个小圆锥体,设置高度(Height)和底部半径(Radius),并设置分辨率(Resolution)。
  4. 使用Glyph3D生成法线可视化

    • 使用vtkGlyph3D将小圆锥体与法线关联,设置SetVectorModeToUseNormal()以使用法线方向,并通过SetScaleFactor()调整圆锥体的大小。
  5. 创建映射器和演员

    • 使用vtkPolyDataMapper将生成的数据映射到演员,并将演员添加到渲染器中。
  6. 渲染和交互

    • 创建渲染窗口和交互器,并启动渲染循环。

示例输入和输出

输入
  • 一个包含人脸部的.vtk.obj文件。例如,你可以使用一个简单的OBJ文件或VTK文件,其中包含一个人脸的网格数据。
输出
  • 一个窗口,显示人脸部的网格,并在每个顶点绘制一个小圆锥体,圆锥体的方向与该顶点的法线方向一致。

运行示例

编译并运行此代码时,需要提供一个人脸的PolyData文件作为输入。例如:

./FaceNormalsVisualization face.vtk


注意事项

  1. 文件格式:确保输入文件是VTK支持的格式(例如.vtk.obj)。
  2. 圆锥体大小:可以通过调整SetScaleFactor()的值来控制圆锥体的大小。
  3. 法线计算:如果法线方向不正确,可以尝试调整vtkPolyDataNormals的参数,例如反转法线方向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68430.shtml

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

相关文章

set集合

set集合 Set系列集合&#xff1a; 无序&#xff1a;存取顺序不一致 不重复&#xff1a;可以去除重复 无索引&#xff1a;没有带索引的方法&#xff0c;所以不能使用普通for循环遍历&#xff0c;也不能通过索引来获取元素 可以看出set是无序的存和打印的顺序不一样 Set接中的…

马尔科夫模型和隐马尔科夫模型区别

我用一个天气预报和海藻湿度观测的比喻来解释&#xff0c;保证你秒懂&#xff01; 1. 马尔可夫模型&#xff08;Markov Model, MM&#xff09; 特点&#xff1a;状态直接可见 场景&#xff1a;天气预报&#xff08;晴天→雨天→阴天…&#xff09;核心假设&#xff1a; 下一个…

「 机器人 」系统辨识实验浅谈

前言 系统辨识实验是一种通过实验和数据分析的方法,用于建立物理系统的数学模型的技术。系统辨识是控制工程和系统科学中的重要环节,尤其是在模型未知或复杂的情况下。以下是系统辨识实验的详细介绍: 1. 系统辨识实验的目的 1.1 建模 为动态系统(如机械系统、电气系统或生…

Word List 1

词汇表中的生词 词汇表中的词组成的搭配&#xff08;我不太认识的&#xff0c;认识的就不写了&#xff09;、重要的派生词 例句中的生词 我自己写的生词&#xff08;用于区分易混淆的词&#xff09; Word List 1 英文音标中文traditional belief传统信条traditional metho…

数论问题76一一容斥原理

容斥原理是一种计数方法&#xff0c;用于计算多个集合的并集中元素的个数&#xff0c;以避免重复计算。以下是其基本内容及相关公式&#xff1a; 两个集合的容斥原理 若有集合A和集合B&#xff0c;那么A与B的并集中元素的个数等于A集合元素个数加上B集合元素个数&#xff0c;再…

python-decouple和 django-environ管理 Python/Django 项目中的环境变量

在现代软件开发中,环境变量的管理是一个至关重要的任务。环境变量通常用于存储敏感信息(如 API 密钥、数据库凭据)或配置信息(如调试模式、日志级别)。为了更安全、更方便地管理环境变量,Python 社区提供了许多工具,其中最流行的两个是 python-decouple 和 django-envir…

SimpleFOC STM32教程10|基于STM32F103+CubeMX,速度闭环控制(有电流环)

导言 SimpleFOC STM32教程09&#xff5c;基于STM32F103CubeMX&#xff0c;ADC采样相电流 如上图所示, 增加了电流环. 效果如下&#xff1a; 20250123-200906 RTT 如上图所示&#xff0c;三相占空比依然是马鞍波。当我用手去给电机施加阻力时&#xff0c;PID要维持目标转速&am…

基于蓝牙6.0的RSSI和UWB融合定位方法,可行性分析

融合RSSI&#xff08;接收信号强度指示&#xff09;和UWB&#xff08;超宽带&#xff09;两种技术进行蓝牙6.0定位是完全可行的&#xff0c;并且可以带来更高的定位精度和稳定性。本文给出分析和MATLAB仿真结果 文章目录 技术优势RSSIUWB融合的优势 实现方案数据融合算法硬件要…

团体程序设计天梯赛-练习集——L1-024 后天

前言 首先祝大家新年快乐&#xff0c;然后博主今点炮让炮崩了一下&#xff0c;水一天 这道题5分非常简单&#xff0c;有不少的做法 L1-024 后天 如果今天是星期三&#xff0c;后天就是星期五&#xff1b;如果今天是星期六&#xff0c;后天就是星期一。我们用数字1到7对应星期…

C#:25大前沿特性揭秘

一、引言 C#&#xff0c;这门诞生于 2000 年的编程语言&#xff0c;自问世以来便在软件开发领域留下了浓墨重彩的一笔。它是微软.NET 框架的旗舰语言&#xff0c;由安德斯・海尔斯伯格&#xff08;Anders Hejlsberg&#xff09;领导的团队精心打造 &#xff0c;设计哲学融合了…

LeetCode100之全排列(46)--Java

1.问题描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案 示例1 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例2 输入&#xff1a;nums [0,1] 输出&#xf…

富文本 tinyMCE Vue2 组件使用简易教程

参考官方教程 TinyMCE Vue.js integration technical reference Vue2 项目需要使用 tinyMCE Vue2 组件(tinymce/tinymce-vue)的第 3 版 安装组件 npm install --save "tinymce/tinymce-vue^3" 编写组件调用 <template><Editorref"editor"v-m…

Babylon.js 中的 setHardwareScalingLevel和getHardwareScalingLevel:作用与配合修改内容

在 Babylon.js 中&#xff0c;Engine类提供了setHardwareScalingLevel和getHardwareScalingLevel方法&#xff0c;用于管理和调整渲染分辨率与屏幕分辨率的比例。这些方法在优化性能和提升画质方面非常有用。尤其是在某些平台不支持硬件反锯齿时&#xff0c;可以考虑使用setHar…

从理论到实践:Django 业务日志配置与优化指南

在现代 Web 开发中,日志记录是确保系统可维护性和可观测性的重要手段。通过合理的日志配置,我们可以快速定位问题、分析系统性能,并进行安全审计。本文将围绕 Django 框架,详细介绍如何配置和优化业务日志,确保开发环境和生产环境都能高效地记录和管理日志。 © ivwdc…

项目集成Nacos

文章目录 1.环境搭建1.创建模块 sunrays-common-cloud-nacos-starter2.目录结构3.pom.xml4.自动配置1.NacosAutoConfiguration.java2.spring.factories 5.引入cloud模块通用依赖 2.测试1.创建模块 sunrays-common-cloud-nacos-starter-demo2.目录结构3.pom.xml4.application.ym…

doris:JSON

JSON 数据类型&#xff0c;用二进制格式高效存储 JSON 数据&#xff0c;通过 JSON 函数访问其内部字段。 默认支持 1048576 字节&#xff08;1 MB&#xff09;&#xff0c;可调大到 2147483643 字节&#xff08;2 GB&#xff09;&#xff0c;可通过 BE 配置string_type_length…

K8S 启动探测、就绪探测、存活探测

先来思考一个问题&#xff1a; 在 Deployment 执行滚动更新 web 应用的时候&#xff0c;总会出现一段时间&#xff0c;Pod 对外提供网络访问&#xff0c;但是页面访问却发生404&#xff0c;这个问题要如何解决呢&#xff1f;学完今天的内容&#xff0c;相信你会有自己的答案。 …

开源 CSS 框架 Tailwind CSS v4.0

开源 CSS 框架 Tailwind CSS v4.0 于 1 月 22 日正式发布&#xff0c;除了显著提升性能、简化配置体验外&#xff0c;还增强了功能特性&#xff0c;具体如下1&#xff1a; 性能提升 采用全新的高性能引擎 Oxide&#xff0c;带来了构建速度的巨大飞跃&#xff1a; 全量构建速度…

YOLOv10 介绍

YOLOv10 是清华大学多媒体智能组推出的新一代目标检测算法。以下是它的一些主要信息: 主要特点与优势: 实时性与准确性并重:在保持高准确性的同时,实现了毫秒级的实时检测速度。通过引入大核卷积和部分自注意模块,在较低计算成本下实现了更高的性能。优化的模型架构: 主干…

基于物联网的智能环境监测系统(论文+源码)

1系统的功能及方案设计 本课题为基于物联网的智能环境监测系统的设计与实现&#xff0c;整个系统采用stm32f103单片机作为主控制器&#xff0c;通过DHT11传感器实现智能环境监测系统温度和湿度的检测&#xff0c;通过MQ传感器实现CO2浓度检测&#xff0c;通过光照传感器实现光照…