【pyVista】在三维模型中的网格属性

news2024/11/15 3:41:35

一,什么是属性?

        属性是存在于 一个网格。在 PyVista 中,我们同时使用点数据和单元数据,并且 允许轻松访问数据字典以保存属性数组 它们位于网格的所有点或所有单元上。

点数据

点数据是指值数组(标量、向量等),这些值 Live 在网格的每个点上。属性数组中的每个元素 对应于网格中的一个点。让我们创建一些点 数据。绘制时,点之间的值为 跨单元格进行插值。

import numpy as np  # 导入 NumPy 库,用于处理数组和生成随机数  
import pyvista as pv  # 导入 PyVista 库,用于三维可视化  

# 从 STL 文件读取网格数据  
mesh = pv.read('hexbeam.stl')  

# 设置相机位置,用于绘制时视角的选择  
cpos = [(6.20, 3.00, 7.50),   # 相机位置的坐标  
        (0.16, 0.13, 2.65),   # 注意点的坐标 (即视角朝向的中心点)  
        (-0.28, 0.94, -0.21)]  # 上向量坐标,控制相机的上方向  

# 为每一个点的数据设置一个名为 'my point values' 的标量值  
mesh.point_data['my point values'] = np.arange(mesh.n_points)  

# 绘制网格,使用 ivalue 'my point values' 表示的标量值,并显示边缘线  
mesh.plot(scalars='my point values', cpos=cpos, show_edges=True)

 

代码解释:
  1. 导入库

    • numpy 用于数值运算和数组操作,这里主要用来生成值数组。
    • pyvista 是一个用于三维可视化的库,可以方便地操作和展示三维数据。
  2. 读取网格文件

    • 使用 pv.read('hexbeam.stl') 从一个 STL 文件中读取三维网格数据。这种文件格式通常用于存储三维模型。
  3. 设置相机位置

    • cpos 是一个列表,包含三个点的三维坐标,定义了绘制图像时的相机位置、查看的目标和相机的上方向。具体包括:
      • 第一个点是相机的位置。
      • 第二个点是相机关注的目标(视野中心点)。
      • 第三个点定义了相机的“上方”方向,有助于用户更好地理解空间的方向。
  4. 设置点数据

    • mesh.point_data['my point values'] 给网格的每一个点分配一个标量数据,这里使用 np.arange(mesh.n_points) 创建一个从 0 到网格点总数的数组,便于颜色映射等可视化。
  5. 绘制网格

    • 使用 mesh.plot() 函数进行网格的可视化,scalars='my point values' 表示使用之前设置的点数据来为每个点上色,cpos=cpos 用于设置相机视角,show_edges=True 则会在绘制时显示网格的边缘线,增强立体效果。

这段代码的最终效果是展示一个三维网格,同时为不同的点赋予不同的颜色,使得可视化更加直观。

单元格数据

        单元格数据是指值数组(标量、向量等),这些值 存在于网格的每个单元中。即整个单元 (2D face 或 3D volume)被分配该属性的值。

import numpy as np  # 导入 NumPy 库,用于处理数组和生成随机数  
import pyvista as pv  # 导入 PyVista 库,用于三维可视化  

# 从 STL 文件读取网格数据  
mesh = pv.read('hexbeam.stl')  

# 设置相机位置,用于绘制时视角的选择  
cpos = [(6.20, 3.00, 17.50),  # 相机位置的坐标  
        (0.16, 0.13, 2.65),   # 注意点的坐标 (即视角朝向的中心点)  
        (-0.28, 0.94, -0.21)]  # 上向量坐标,控制相机的上方向  

# mesh.point_data['my point values'] = np.arange(mesh.n_points)  # 注释掉的代码(不执行)  

# 为每一个单元格 (cell) 的数据设置一个名为 'my cell values' 的标量值  
mesh.cell_data['my cell values'] = np.arange(mesh.n_cells)  

# 绘制网格,使用 'my cell values' 表示的标量值,并显示边缘线  
mesh.plot(scalars='my cell values', cpos=cpos, show_edges=True)

代码解释:
  1. 设置单元格数据

    mesh.cell_data['my cell values'] = np.arange(mesh.n_cells) 
    • 这行代码为网格中的每一个单元格(cell)分配一个标量值。
    • mesh.n_cells 返回当前网格中单元格的总数。np.arange(mesh.n_cells) 创建一个从 0 到单元格总数的数组,赋值给 my cell values
    • 此时每个单元格都有了一个唯一的标量值,这些值可以用于后续的可视化,比如色彩映射。
  2. 绘制网格

    mesh.plot(scalars='my cell values', cpos=cpos, show_edges=True) 
    • 这行代码调用 mesh.plot() 方法来可视化网格数据。
    • scalars='my cell values' 指定使用之前设置的单元格数据 (my cell values) 进行色彩映射。这意味着每个单元格的颜色将根据其标量值进行变化,帮助观察者直观地理解网格的结构及分布情况。
    • cpos=cpos 用于设置相机的视角,这样绘制时能够以特定的视点观察网格。
    • show_edges=True 使得绘制的结果中显示网格的轮廓线,增加了立体感,便于观察网格结构的细节。
总结

这段代码最终展示了一个带有颜色映射的三维网格,其中颜色的变化依据每个单元格的标量值。通过单元格数据的色彩映射,使得可视化效果更为丰富,有助于更好地分析和理解三维网格的特征。

        以下是点数据与单元数据的比较,以及点数据如何 在映射颜色时跨单元格进行插值。这与 cell 不同 data 中具有单个值,该 data 在单元格的域中具有单个值:

import numpy as np  
import pyvista as pv  

# 读取 STL 文件  
uni = pv.read('hexbeam.STL')  

# 生成示例点数据和单元数据  
# 假设您有与点数量或单元数量相同的随机值  
uni.point_data['My Point Data'] = np.random.random(uni.n_points)  
uni.cell_data['My Cell Data'] = np.random.random(uni.n_cells)  

# 创建一个绘图对象,并设置为 1 行 2 列的子图  
pl = pv.Plotter(shape=(1, 2), border=False)  

# 在第一个子图中绘制点数据  
pl.add_mesh(uni, scalars='My Point Data', show_edges=True)  

# 切换到第二个子图  
pl.subplot(0, 1)  

# 在第二个子图中绘制单元数据  
pl.add_mesh(uni, scalars='My Cell Data', show_edges=True)  

# 显示绘图  
pl.show()
代码详解
  1. 导入库

    • import numpy as np: 导入NumPy库,用于生成随机数及处理数组。
    • import pyvista as pv: 导入PyVista库,用于三维可视化。
  2. 读取 STL 文件

    • uni = pv.read('001.STL'): 使用PyVista读取名为 001.STL 的网格文件,并将其存储在 uni 变量中。uni 现在是一个包含 STL 文件几何信息的网格对象。
  3. 生成示例数据

    • uni.point_data['My Point Data'] = np.random.random(uni.n_points): 为每个网格的顶点生成随机的标量值,并将其存储在 point_data 中,键名为 'My Point Data'uni.n_points 返回网格点的总数。
    • uni.cell_data['My Cell Data'] = np.random.random(uni.n_cells): 为每个单元(面)生成随机的标量值,并将其存储在 cell_data 中,键名为 'My Cell Data'uni.n_cells 返回网格单元的总数。
  4. 创建绘图对象

    • pl = pv.Plotter(shape=(1, 2), border=False): 创建一个绘图对象 pl,并设置为 1 行 2 列的子图布局。border=False 表示不需要显示边框。
  5. 绘制网格

    • pl.add_mesh(uni, scalars='My Point Data', show_edges=True): 在第一列子图中添加网格。使用 'My Point Data' 作为标量(色彩)来显示网格点的颜色,show_edges=True 表示绘制网格的边缘线,增强可视化效果。
  6. 切换子图

    • pl.subplot(0, 1): 切换到第一行第二列的子图,准备在该位置绘制新的图形。
  7. 绘制单元数据

    • pl.add_mesh(uni, scalars='My Cell Data', show_edges=True): 在第二列子图中添加网格,同样使用 'My Cell Data' 作为标量显示单元的颜色,不同的随机值将导致不同的颜色映射。
  8. 显示绘图

    • pl.show(): 打开一个窗口,展示以上绘制的结果。
总结

这段代码实现了从一个 STL 文件读取 3D 网格,并为网格的点和单元生成示例随机数数据,以便进行可视化。通过将网格分为两个子图,分别显示顶点数据和单元数据,用户可以直观地看到不同标量数据的可视化效果。

应用数据

        字段数据不直接与点或像元关联 但仍应附加到网格。这可能是一个字符串数组 

将单元分配给网格

以下是我们如何为 (单元)cell 属性赋值并绘制它。在这里,我们 生成包含 6 面的立方体,并为每个面分配一个整数,然后绘制它。range(6)。请注意这与将标量分配给每个点有何不同

 

import pyvista as pv  # 导入 PyVista 库  

# 创建一个立方体对象  
cube = pv.Cube()  
# 为立方体的单元数据 (cell data) 添加一组标量数据,范围为 0 到 5  
cube.cell_data['myscalars'] = range(6)  

# 复制立方体对象  
other_cube = cube.copy()  
# 为另一个立方体的点数据 (point data) 添加一组标量数据,范围为 0 到 7  
other_cube.point_data['myscalars'] = range(8)  

# 创建一个绘图器,设置为 1 行 2 列的布局,边框宽度为 1  
pl = pv.Plotter(shape=(1, 2), border_width=1)  
# 在第一个子图中添加第一个立方体,并使用 'coolwarm' 色图进行着色  
pl.add_mesh(cube, cmap='coolwarm')  
# 切换到第二个子图  
pl.subplot(0, 1)  
# 在第二个子图中添加第二个立方体,并同样使用 'coolwarm' 色图进行着色  
pl.add_mesh(other_cube, cmap='coolwarm')  
# 显示绘图  
pl.show()

 

代码解释:

  1. 导入库:首先,代码导入了 pyvista 库,这是一个用于 3D 可视化的 Python 库。

  2. 创建立方体:使用 pv.Cube() 创建一个立方体实例,赋值给变量 cube

  3. 添加单元数据:利用 cell_data 属性为立方体添加标量数据,这些数据是一个范围从 0 到 5 的整数。这些标量数据会在渲染时用于控制立方体表面的颜色。

  4. 复制立方体:使用 copy() 方法复制 cube 以创建 other_cube

  5. 添加点数据:为复制的立方体添加点数据(point_data),这组标量数据是范围从 0 到 7 的整数,用于控制第二个立方体颜色的显示。

  6. 创建绘图器:使用 pv.Plotter 创建绘图器,并设置绘图的布局为 1 行 2 列。

  7. 添加和渲染立方体

    • 在第一个子图内渲染第一个立方体(cube),使用 "coolwarm" 颜色映射。
    • 切换到第二个子图,渲染第二个立方体(other_cube),也使用 "coolwarm" 颜色映射。
  8. 展示绘图:最后,通过 pl.show() 显示绘图窗口,渲染二个立方体的 3D 图像。

 

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

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

相关文章

https的连接过程

根证书: 内置在操作系统和浏览器中,可手动添加,下级是中间证书或服务器证书,只有当中间证书或服务器证书关联到已存在的根证书时,中间证书或服务器证书才视为有效 中间证书: 位于根证书和服务器证书之间,他们之间也可以没有中间证书,作用是对根证书增加一个下级,方便管理,由根…

一款批量下载 B 站动态页图片的脚本

在逛 B 站的时候,总能看到不少 UP 会发很多图片,此时一个一个保存非常麻烦,而且文件名都是随机的字符串,还得手工重命名。 为此,特地搜索了下有没相关的浏览器插件或油猴脚本,还真给我找到一个。 脚本地址…

Kafka 下载安装及使用总结

1. 下载安装 官网下载地址:Apache Kafka 下载对应的文件 上传到服务器上,解压 tar -xzf kafka_2.13-3.7.0.tgz目录结果如下 ├── bin │ └── windows ├── config │ └── kraft ├── libs ├── licenses └── site-docs官方文档…

专注并不意味只做一件事

原创内容第658篇,专注量化投资、个人成长与财富自由。 财务自由本身就是一个很有争议的领域。 有谁能靠别人实现财富自由呢? 这个逻辑起点本身就有问题。 如果预期正确,那这些自媒体还是有用处的。 好比我现在对于阅读和书籍的预期&…

深入解析 Apache Doris架构、应用场景与最佳实践

一、Doris 简介 Apache Doris 是一款现代化的 MPP(Massively Parallel Processing)数据库,专注于解决大规模数据分析和实时查询的需求。它最初源自百度的 Palo 项目,随后贡献给了 Apache 基金会,并在开源社区的共同努…

『功能项目』QFrameWork框架重构OnGUI【63】

我们打开上一篇62QFrameWork背包框架的项目, 上文将功能实现在一个脚本中 本章要做的事情让脚本实现背包框架思想 首先按照图示创建脚本: 创建脚本:Item.cs namespace QFramework {public class Item{//道具public string Key;public string …

【CSS in Depth 2 精译_033】5.4 Grid 网格布局的显式网格与隐式网格(中)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

C++速通LeetCode中等第18题-删除链表的倒数第N个结点(最简单含注释)

绝妙!快慢指针法,快指针先走n步(复杂度O(n),O(1)): /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(n…

GS-SLAM论文阅读笔记--TAMBRIDGE

前言 本文提出了一个自己的分类方法,传统的视觉SLAM通常使用以帧为中心的跟踪方法,但是3DGS作为一种高效的地图表达方法好像更侧重于地图的创建。这两种方法都有各自的优缺点,但是如果能取长补短,互相结合,那么就会是…

STM32精确控制步进电机

目的:学习使用STM32电机驱动器步进电机,进行电机运动精确控制。 测试环境: MCU主控芯片STM32F103RCT6 ;A4988步进电机驱动器模块;微型2相4线步进电机10mm丝杆滑台,金属丝杆安装有滑块。 10mm二相四线微型…

我的AI工具箱Tauri版-FasterWhisper音频转文本

本教程基于自研的AI工具箱Tauri版进行FasterWhisper音频转文本服务。 FasterWhisper音频转文本服务 是自研AI工具箱Tauri版中的一款模块,专门用于将音频或视频中的语音内容自动转化为文本或字幕。通过简单的配置,该工具能够批量处理大量音频或视频文件&…

高密原型验证系统解决方案(下篇)

0 引言 我们在上篇中和大家探讨了用户在进行大规模 复杂 SoC 设计原型验证时在全局时钟及复位同步, 大规模设计分割以及高速接口与先进 Memory 控制 器 IP 验证等方面遇到的关键困难,并提出了相应的 解决方案帮助用户来克服这些困难。接下来我们会 和用户…

OpenCV运动分析和目标跟踪(2)累积操作函数accumulateSquare()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将源图像的平方加到累积器图像中。 该函数将输入图像 src 或其选定区域提升到2的幂次方,然后加到累积器 dst 中: dst ( …

计算机毕业设计之:基于微信小程序的共享充电桩系统的设计与实现

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

通信工程学习:什么是TLS传输层安全协议

TLS:传输层安全协议 TLS(Transport Layer Security)传输层安全协议是一种用于在两个通信应用程序之间提供保密性、数据完整性以及真实性的安全协议。它是SSL(Secure Sockets Layer)协议的后继者,继承并增强…

通信工程学习:什么是TMN电信管理网

TMN:电信管理网 TMN,全称Telecommunications Management Network,即电信管理网,是为保持电信网正常运行和提供服务,对它进行有效的管理所建立的软硬件系统和组织体系的总称,是现代电信网运行的支撑系统之一…

2024/9/22 leetcode 128题 283题

目录 128.最长连续序列 题目描述 题目链接 解题思路与代码 题目2 题目描述 题目链接 解题思路与代码 128.最长连续序列 题目描述 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请…

秩一的等价转化

Lemma 2. For a positive semi-definite Hermitian matrix A ∈ C M M \mathbf{A}\in\mathbb{C}^{M\times M} A∈CMM, the condition Rank ( A ) 1 \left(\mathbf{A}\right)1 (A)1 is equivalent to t h e following conditions the\textit{ following conditions} the fol…

使用GPU 加速 Polars:高效解决大规模数据问题

Polars 最近新开发了一个可以支持 GPU 加速计算的执行引擎。这个引擎可以对超过 100GB 的数据进行交互式操作能。本文将详细讨论 Polars 中DF的概念、GPU 加速如何与 Polars DF协同工作,以及使用新的 CUDA 驱动执行引擎可能带来的性能提升。 Polars 核心概念 Polar…

最新 idea 2024 入门使用详细教程

IntelliJ IDEA:这是一款由JetBrains公司开发的Java集成开发环境(Integrated Development Environment),被广泛认为是目前Java开发者最好的集成开发工具之一。它支持Java、Groovy、Kotlin等多种编程语言,并且提供了丰富…