numpy-stl实战3D建模【Python】

news2024/11/23 18:33:07

想象一下,我们需要用 python 编程语言构建某个物体的三维模型,然后将其可视化,或者准备一个文件以便在 3D 打印机上打印。 有几个库可以解决这些问题。 让我们来看看,如何在 Python 中从点、边和图元构建 3D 模型。 如何执行基本的 3D 建模技术:移动、旋转、合并、减去等。

在这里插入图片描述

推荐:用 NSDT设计器 快速搭建可编程3D场景。

我们将使用numpy-stl构建一个 Menger Sponge分形,将模型保存到 stl 文件,然后渲染图像。 在此过程中,我们简要了解了数据结构和术语。

所有示例均针对 Linux 操作系统提供。代码示例可以在 GitHub 存储库中找到。

1、Numpy-stl概述

在Numpy-stl中, 多边形网格的结构如下:
在这里插入图片描述

Vertices - 点列表。 每个点由三个数字描述——3 维空间中的坐标。

接下来,我们将使用 Jupyter notebook。示例:numpy_stl_example_01.ipynb

import numpy as np
from myplot import plot_verticles
vertices = np.array([
[-3, -3, 0],
[+3, -3, 0],
[+3, +3, 0],
[-3, +3, 0],
[+0, +0, +3]
])
plot_verticles(vertices = vertices, isosurf = False)

在这里插入图片描述

尽管只描述了顶点,但你已经可以看到如果将它们与三角形连接起来模型会是什么样子:

plot_verticles(vertices = vertices, isosurf = True)

在这里插入图片描述

看起来面已经存在。 但现在我们只有顶点。 要创建一个 STL 文件,让我们描述面,这可以手动完成,或者提供 scipy 库中的 spatial.ConvexHull 函数的这种操作。

示例:numpy_stl_example_02.ipynb

import numpy as np
from scipy import spatial
from stl import mesh
from myplot import plot_mesh
vertices = np.array(
[
[-3, -3, 0],
[+3, -3, 0],
[+3, +3, 0],
[-3, +3, 0],
[+0, +0, +3]
]
)
hull = spatial.ConvexHull(vertices)
faces = hull.simplices

结果,faces 数组包含了这个 faces 描述:

array([
[4, 1, 0],
[4, 2, 1],
[3, 4, 0],
[3, 4, 2],
[3, 2, 1],
[3, 1, 0]
], dtype=int32)

Faces - 面列表。 每个三角形面由三个顶点(点)描述。 换句话说,点在顶点数组中的位置。

例如,最后一个面包含数字 3、1、0。所以面与顶点数组的第 0、1 和 3 个元素的点组装在一起:

在这里插入图片描述

Mesh ——一组顶点和面,决定多面体物体的形状。

myramid_mesh = mesh.Mesh(
  np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype)
)
for i, f in enumerate(faces):
  for j in range(3):
    myramid_mesh.vectors[i][j] = vertices[f[j],:]
    plot_mesh(myramid_mesh)

在这里插入图片描述

从图中可以看出,金字塔的一个面被颠倒了。 在下面的例子中,构造分形时,不会使用ConvexHull方法,因为它把面的点按任意顺序排列,这会导致一些面发生翻转。

myramid_mesh.save('numpy_stl_example_02.stl')

要查看 STL 文件,我使用免费软件程序:Blender。

在这里插入图片描述

spatial.convexhull 方法旨在计算凸壳,可以很好地处理金字塔和立方体。 但在有空腔的物体中,由于点数不一致,会丢失部分点,拼装STL时会出错。

这在二维示例中清晰可见:numpy_stl_example_03.ipynb

import matplotlib.pyplot as plt
from scipy import spatial
import numpy as np
points = np.array([
[0,0],
[-2,0],
[-2,2],
[0,1.5],
[2,2],
[2,0]
])
hull = spatial.ConvexHull(points)

hull.simplices 包含面描述:

array([
[2, 1],
[2, 4],
[5, 1],
[5, 4]
], dtype=int32)

让我们绘制顶点和面:

plt.plot(points[:,0], points[:,1], 'o')
for simplex in hull.simplices:
  plt.plot(points[simplex, 0], points[simplex, 1], 'k-')

在这里插入图片描述

对于这种情况,你可以找到 convexhull 的替代方法,或手动描述边缘:

faces = np.array([
[0, 1],
[1, 2],
[2, 3],
[3, 4],
[4, 5],
[5, 0]
])
plt.plot(points[:,0], points[:,1], 'o')
for simplex in faces:
  plt.plot(points[simplex, 0], points[simplex, 1], 'k-')

在这里插入图片描述

2、Numpy-stl构建分形

是时候建立一个分形了。 Numpy-stl 中没有布尔减法函数。 为了构建 Menger Sponge 分形,我们采用了相反的方法。 有两种方法:

  • 构建一个基本的立方体网格。 我们称它为体素。
  • 将多个体素组合成一个网格。

我们将从立方体构造一个分形,就像构造函数一样。

构造分形的逻辑说明:

Suppose the fractal face length is 1. Depth of fractal is the count of unique hole sizes. Voxel length depends on depth of the fractal, it is divided by 3 with each new level of depth.
We gonna find the voxel side at depths 1 and 2. Let's simplify the task, turning the fractal from 3 to 1-dimensional case:

If fractal level is 2, then the length of the cube side will be 1 / (3 ** 2) which is equivalent to 1/9. Let's make a set of cubes so that they filled resulting voxel cube by their location. Let's calculate holes area. Exclude voxels that are in holes. In conclusion, unite the remaining voxels in one object and save.

在这里插入图片描述

示例:numpy_stl_example_04.ipynb

在这里插入图片描述

3、Numpy-stl渲染

为了渲染图像,我们将从 STL 文件加载的网格发送到 plot_mesh 函数。

示例:numpy_stl_example_05.ipynb
在这里插入图片描述


原文链接:numpy-stl实战3D建模 — BimAnt

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

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

相关文章

如何对图片进行卷积计算

1 问题 如何对图片进行卷积计算? 2 方法 先导入torch和torch里的nn类,然后设置一个指定尺寸的随机像素值的图片,然后使用nn.conv2d函数进行卷积计算,然后建立全连接层,最后得到新的图片的尺寸 步骤: (1) 导入实验所需要…

CyberLink的音频编辑软件AudioDirector Ultra 13.4版本在win10系统的下载与安装配置教程

目录 前言一、AudioDirector Ultra安装二、使用配置总结 前言 AudioDirector Ultra是由CyberLink公司开发的一款强大的音频编辑工具,旨在为用户提供全面的音频后期制作和编辑解决方案。该软件支持多种音频格式,包括MP3、WAV、M4A等,并且可以…

网络工程师精选习题详解(二)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 201.通常使用()为IP数据报进行加密。 A.IPSec B.PP2P C.HTTPS D.TLS 答案:A IP Sec可以为IP数据报进行加密。 …

【004hive基础】hive的文件存储格式与压缩

文章目录 一.hive的行式存储与列式存储二. 存储格式1. TEXTFILE2. ORC格式3. PARQUET格式 ing 三. Hive压缩格式1. mr支持的压缩格式:2. hive配置压缩的方式:2.1. 开启map端的压缩方式:2.2.开启reduce端的压缩方式: 四. hive中存储格式和压缩相结合五. hive主流存储格式性能对比…

【分立元件】MOSFET的工作原理

MOSFET适用于瓦至十数千瓦的中小功率,特别适用于电源管理行业的入门学习。IGBT和MOSFET使用相似,但属于中大功率场合才使用,如果想使用好IGBT,也要先学习MOSFET。 对于MOSFET的学习我们需要学习它的工作原理,知道MOSFET的主要参数,MOSFET的开关过程以及如何驱动MOSFET,应…

技术最强,干活最多,但不会来事,又不是嫡系,得不到领导重用,这种情况去创业公司会不会好点?...

能力强但情商不高,许多程序员都有这样的问题,这种情况怎么办? 一位程序员问: 组内技术能力最强,干活最多,解决不了的问题就会派他上,领导嘴上认可,但因为他不会来事,又不…

一文搞定十大排序算法

文章目录 概述冒泡排序 (Bubble Sort)算法步骤图解算法代码实现算法分析 选择排序 (Selection Sort)算法步骤算法图解代码实现算法分析 插入排序(Insertion Sort)算法步骤图解算法代码实现算法分析 希尔排序 (Shell Sort)算法步骤图解算法代码实现算法分析 归并排序 (Merge Sor…

多维时序 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的多变量时间序列预测

多维时序 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的多变量时间序列预测 目录 多维时序 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多…

系统集成实验模拟总公司和分公司之间通信(涉及mpls vxn,链路聚合,nat,vlan划分,单臂路由,dhcp....)

目录 一 需求描述 二 需求分析 三 实验拓扑 四 实验配置 4.1 总公司 4.1.1 vlan间通信 4.1.2 dhcp自动分配ip 配置地址池 接口开启dhcp 4.1.3 链路聚合 4.1.4 ospf实现内网通信 4.2 分公司 4.2.1 单臂路由 4.2.2 dhcp自动获取ip 4.2.3 ospf实现内网通信 4.3 mp…

判断传入数据是否为列表、数组、数据框等数据结构pd.api.types.is_list_like()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断传入数据是否为 列表、数组、数据框等数据结构 pd.api.types.is_list_like() 选择题 下列说法错误的是? import pandas as pd import numpy as np print("【执行】pd.api.ty…

基于html+css的图展示85

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

深度学习之使用Keras构建分类问题的MLP神经网络——用于糖尿病预测

大家好,我是带我去滑雪! Keras 是一个用于构建和训练深度学习模型的高级 API,它基于 Python编写,并能够运行于 TensorFlow, CNTK, 或者 Theano 等深度学习框架之上。Keras简化了深度神经网络的构建流程,让用户能够更加…

云计算基础——云计算主流解决方案

原数据:描述数据的数据,不可分割。 7.1 Google云计算技术 7.1.1 GCP Google 将这些技术组合在一起,运用这些从自身业务需求出发,逐步发展起来的一系列云计算技术和工具搭建起了其面向商业的云计算解决方案Google Cloud Platform (…

【数据湖架构】Azure Data Lake数据湖指南

数据湖漫游指南 文件大小和文件数文件格式分区方案使用查询加速我如何管理对我的数据的访问?我选择什么数据格式?如何管理我的数据湖成本?如何监控我的数据湖?ADLS Gen2 何时是您数据湖的正确选择?设计数据湖的关键考虑…

Vue.observable的理解

一、Observable 是什么 Observable 翻译过来我们可以理解成可观察的 先来看其在Vue中的定义 Vue.observable,让一个对象变成响应式数据。Vue 内部会用它来处理 data 函数返回的对象 返回的对象可以直接用于渲染函数和计算属性内,并且会在发生变更时触发…

PDF.js实现按需分片加载pdf文件-包含前后端开发源码和详细开发教程

PDF.js实现按需加载pdf文件 说明前言前端项目分片加载的效果前端项目结构前端核心代码项目运行与访问 后端项目项目结构核心代码实现注意事项 项目源码 说明 本文主要是介绍pdf.js的前后端项目的实现,包含可直接运行的源码。由于本人偏向于后端开发,因此…

Redis设计逻辑及生产部署问题整理

数据结构 redis数据结构包括:简单动态字符串SDS、链表、字典、跳跃表、整数组合、压缩列表。 SDS:在增加/减少字符串时不会频繁进行内存充分配,采用了空间预分配和惰性空间释放两种优化策略。 链表:链表节点使用void*保存节点值&a…

Stable Diffusion Web-UI 安装指南

Stable DIffusion 是 Stability.AI 开源的 text-to-image 模型,目前类似产品有 Midjourney 以及 OpenAI 的 DELL-2 ;从AI绘画效果上来说,Midjourney 目前公认是最好的;但从模型的可玩性和发展潜力来看,个人观点来看&am…

【009】C++数据类型之转义字符和类型转换

C数据类型之转义字符和类型转换 引言一、转义字符1.1、概念1.2、八进制转义1.3、十六进制转义 二、类型转换2.1、自动类型转换原则2.2、强制类型转换 三、C新特性中类型转换的扩展3.1、隐式类型转换3.2、显式类型转换 总结 引言 💡 作者简介:专注于C/C高…

Packet Tracer – 配置单臂路由器 VLAN 间路由

Packet Tracer – 配置单臂路由器 VLAN 间路由 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 R1 G0/0.10 172.17.10.1 255.255.255.0 不适用 G0/0.30 172.17.30.1 255.255.255.0 不适用 PC1 NIC 172.17.10.10 255.255.255.0 172.17.10.1 PC2 NIC 1…