numpy-stl库的基本使用及notebook下的使用

numpy-stl库的基本使用及notebook下的可视化

https://pypi.org/project/numpy-stl/

安装

conda install -c conda-forge numpy-stl

引入资源

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
from stl import mesh

读取stl文件

stl_file = 'assets/fan.stl'
stl_mesh = mesh.Mesh.from_file(stl_file)

print('stl_mesh info:', stl_file)
print('vectors=', len(stl_mesh.vectors))
print('points=', len(stl_mesh.points))
print('normals=', len(stl_mesh.normals))

out 输出如下

stl_mesh info: assets/fan.stl
vectors= 1792
points= 1792
normals= 1792

points、vectors、normals对比

points基本等同于vectors,只是数据结构不同。每个points对应stl文件中的一个三角面3个点的数据,每个点有3个数值

normals则为一个法向量

数据如下所示:

print('points:', stl_mesh.points[0])
print('vectors:', stl_mesh.vectors[0])
print('normals:', stl_mesh.normals[0])

输出如下:

points: [  5.044177 -23.97724   97.42546    5.656812 -25.27308  106.0007
   5.831299 -23.8088    97.4243  ]
vectors: [[  5.044177 -23.97724   97.42546 ]
 [  5.656812 -25.27308  106.0007  ]
 [  5.831299 -23.8088    97.4243  ]]
normals: [-1.4429097  6.7504697  1.123177 ]

stl_mesh.xstl_mesh.ystl_mesh.z

print('stl_mesh.x: lenth =',len(stl_mesh.x))
print(stl_mesh.x)
stl_mesh.x: lenth = 1792
[[ 5.044177e+00  5.656812e+00  5.831299e+00]
 [ 6.767709e+00  6.065555e+00  6.507149e+00]
 [ 5.839584e+00  6.021440e+00  5.280423e+00]
 ...
 [-9.914779e-05 -9.914779e-05 -9.914779e-05]
 [-9.914779e-05 -9.914779e-05  6.999990e+01]
 [ 6.999990e+01 -9.914779e-05  6.999990e+01]]

获取stl信息 (-获取体积,-重心, -惯性矩)

#  (Volume-获取体积, Center of gravity-重心, Inertia-惯性矩)
volume, cog, inertia = stl_mesh.get_mass_properties()
print("Volume                                  = {0}".format(volume))
print("Position of the center of gravity (COG) = {0}".format(cog))
print("Inertia matrix at expressed at the COG  = {0}".format(inertia[0,:]))
print("                                          {0}".format(inertia[1,:]))
print("                                          {0}".format(inertia[2,:]))


# 获取包围盒子
def get_min_max(mesh):
    minx = mesh.x.min()
    miny = mesh.y.min()
    minz = mesh.z.min()
    maxx = mesh.x.max()
    maxy = mesh.y.max()
    maxz = mesh.z.max()
    return minx, miny, minz, maxx, maxy,maxz

# 获取最大包围盒
minx, miny, minz, maxx, maxy,maxz = get_min_max(stl_mesh)
print('minx, miny, minz, maxx, maxy, maxz  =>', minx, miny, minz, maxx, maxy,maxz )
Volume                                  = 72816.68152088734
Position of the center of gravity (COG) = [ 33.07755097 -17.88736306  27.97393759]
Inertia matrix at expressed at the COG  = [60897330.17635337 -1572272.4035636   3817171.80348613]
                                          [-1572272.4035636  80751169.91015446  3975033.54231323]
                                          [ 3817171.80348613  3975033.54231323 29649477.37738535]
minx, miny, minz, maxx, maxy, maxz  => -9.914779e-05 -32.0 0.000244812 69.9999 3.552714e-15 106.0016

手动创建一个mesh网格模型,并保存

# 定义8个vector
vertices = np.array([
    [-1, -1, -1],
    [+1, -1, -1],
    [+1, +1, -1],
    [-1, +1, -1],
    [-1, -1, +1],
    [+1, -1, +1],
    [+1, +1, +1],
    [-1, +1, +1]
])
# 定义12个triangle
faces = np.array([
    [0, 3, 1],
    [1, 3, 2],
    [0, 4, 7],
    [0, 7, 3],
    [4, 5, 6],
    [4, 6, 7],
    [5, 1, 2],
    [5, 2, 6],
    [2, 3, 6],
    [3, 7, 6],
    [0, 1, 5],
    [0, 5, 4]
])

# 创建mesh
cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, face in enumerate(faces):
    for j in range(3):
        cube.vectors[i][j] = vertices[face[j], :]
cube.save('cube-write.stl', mode=stl.Mode.ASCII)

旋转移动mesh对象

# 平移
stl_mesh.translate(np.array([0,30,0])) # y方向移动
# 旋转
stl_mesh.rotate([0.0, 1.0, 0.0], np.radians(180)) # 绕y轴旋转90度

stl 3D可视化


show_mesh = stl_mesh
# Create a new plot
figure = plt.figure()
axes = figure.add_subplot(projection='3d')

# Load the STL files and add the vectors to the plot
axes.add_collection3d(mplot3d.art3d.Poly3DCollection(show_mesh.vectors))

# Auto scale to the mesh size
scale = show_mesh.points.flatten()
axes.auto_scale_xyz(scale, scale, scale)

# Show the plot to the screen
plt.show()

在这里插入图片描述

jupyter-notebook中使用

可直接在notebook中渲染3D
在这里插入图片描述

numpy-stl的二进制与ASCII转换

numpy-stl安装好后,还有个比较方便的格式转化命令,如下所示,可直接在命令行下执行

$ stl2bin <your_ascii_stl_file.stl> <new_binary_stl_file.stl>
$ stl2ascii <your_binary_stl_file.stl> <new_ascii_stl_file.stl>
$ stl <your_ascii_stl_file.stl> <new_binary_stl_file.stl>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安卓逆向案例——X酷APP逆向分析

X酷APP逆向分析 这里介绍一下两种不同的挂载证书的方法。 chls.pro/ssl无法在浏览器中下载证书是什么原因解决方法&#xff1a; 法一 1. 挂载系统分区为读写 使用正确的挂载点来挂载系统分区为读写&#xff1a; su mount -o remount,rw /dev/uijISjR/.magisk/block/syste…

河南大学24计算机考研数据,有三个学院招收计算机相关专业,都是考的408!

河南大学&#xff08;Henan University&#xff09;&#xff0c;简称“河大”&#xff0c;是河南省人民政府与中华人民共和国教育部共建高校&#xff0c;国家“双一流”建设高校&#xff0c;入选国家“111计划”、中西部高校基础能力建设工程、卓越医生教育培养计划、卓越法律人…

Spring Boot连接Redis集群

1、问题写在前面 1.1、问题描述&#xff1a;Redis集群节点地址发现失败 Unable to connect to [172.17.0.4:7303]: connection timed out: /172.17.0.4:7303 1.2、解决方案&#xff1a; redis.conf 中添加配置 cluster-announce-ip 192.168.56.11 1.3、方案出处&#xff1a;…

VC++学习(5)——文本编程,插入符的初始化,图形插入符;文字始终在窗口;字符输入功能,回车换行,删除,左键定位;字体修改,字体平滑变色

目录 引出第五讲 文本编程新建项目输入线的初始化根据字体大小定义插入符大小创建图形插入符文字始终保存在窗口中CString类通过字符串资源 路径层字符输入的功能键盘输入消息鼠标左键消息保存点击位置的坐标 输入回车键的处理删除文字的实现 字符输入功能代码字体的修改模拟卡…

交叉注意力一脚踹进医学图像分割!新成果精度、效率表现SOTA

为解决传统方法的局限性&#xff0c;研究者们提出了将交叉注意力机制应用于医学图像分割。 交叉注意力机制能更有效地整合来自不同模态/尺度的特征&#xff0c;让模型同时捕捉全局和局部信息&#xff0c;加速学习并减少干扰。这样不仅可以提高分割的精度&#xff0c;还可以减少…

IMU用于飞行坐姿校正

为了提升长途飞行的舒适度并预防乘客因不良坐姿导致的身体不适&#xff0c;来自荷兰上海两所大学的研究团队携手开发出一种创新的“舒适穿戴”设备&#xff0c;专为识别飞行中的坐姿设计。 研究团队制作了两种原型设备&#xff1a;一种追求极致舒适&#xff0c;另一种为紧身设…

(vue3)引入组件标红,...has no default export 组件没有默认导出

(vue3)引入组件标红&#xff0c;…has no default export 组件没有默认导出 一、项目背景&#xff1a; 创建的vitevue3ts项目页面有标红,但程序不报错 二、原因 由于之前安装了 Vetur 插件&#xff0c;Vetur 默认使用 eslint-plugin-vue&#xff0c;并且强制 export default …

有没有屏幕悬浮翻译软件?打开窗口即可实时翻译

随着#高考结束该出发看世界了#这一话题的火热&#xff0c;对于不能远行的朋友&#xff0c;网上冲浪是了解世界的好方式。 然而&#xff0c;面对外语网页、资料或视频&#xff0c;英语不流利的小伙伴可能会有些困扰。别急&#xff0c;悬浮翻译软件能帮你将屏幕上的外语文字即时…

为什么伦敦金新手不能用一小时图及以下的时间周期?

刚进入伦敦金市场的投资者&#xff0c;一般不建议使用较低的时间周期&#xff0c;如1小时图或以下。不仅如此&#xff0c;新手或者兼职投资者会被要求使用较高的时间周期交易&#xff0c;如4小时图或日线图&#xff0c;这有什么道理呢&#xff1f;下面我们就来讨论一下。 新手的…

增加attention的seq2seq和transformer有什么区别

1.seq2seq是什么 seq2seq 是一个Encoder–Decoder 结构的网络&#xff0c;它的输入是一个序列&#xff0c;输出也是一个序列。Encoder 中将一个可变长度的信号序列变为固定长度的向量表达&#xff0c;Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。   很多自然…

C# Winform 开源UI库

WinForms&#xff0c;作为微软.NET框架下的一个桌面应用程序开发工具&#xff0c;自1999年首次亮相以来&#xff0c;已经走过了二十多年的发展历程。它以其简单直观的拖拽式界面设计和丰富的控件库&#xff0c;成为了大众喜爱的入门学习编程工具。由于它是比较基础的开发工具&a…

宠物健康顾问系统的设

计 管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;顾问管理&#xff0c;用户管理&#xff0c;健康知识管理&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;公告管理 顾问账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0…

带颜色的3D点云数据发布到ros1中(通过rviz显示)python、C++

ros中发布点云数据xyz以及带颜色的点云数据xyzrgb ros中发布点云数据xyz可以直接用python来做或者C(看个人偏好) ros中发布带颜色的点云数据xyzrgb环境1.新建ROS工作空间2.创建功能包 ros中发布点云数据xyz 可以直接用python来做或者C(看个人偏好) 在这里我们带有颜色的点云数…

Unity【入门】光源、物理、音效系统

核心系统 文章目录 核心系统1、光源系统基础1、光源组件2、光面板相关 2、物理系统之碰撞检测1、刚体 RigidBody2、碰撞器 Collider3、物理材质4、碰撞检测函数5、刚体加力 3、音效系统1、音频文件导入2、音频源和音频监听器脚本3、代码控制音频源4、麦克风输入相关 1、光源系统…

【单片机毕业设计选题24018】-基于STM32和阿里云的农业大棚系统

系统功能: 系统分为手动和自动模式&#xff0c;上电默认为自动模式&#xff0c;自动模式下系统根据采集到的传感器值 自动控制&#xff0c;温度过低后自动开启加热&#xff0c;湿度过高后自动开启通风&#xff0c;光照过低后自动开启补 光&#xff0c;水位过低后自动开启水泵…

C++初学者指南第一步---11.字符串(基础)

C初学者指南第一步—11.字符串&#xff08;基础&#xff09; 文章目录 C初学者指南第一步---11.字符串&#xff08;基础&#xff09;1. std::string2. char std::string的元素类型3. std::string字符串操作4. 字面量4.1 C风格字符串字面量4.2 "std::string 字面量"s…

openEuler 22.03 (LTS-SP1)服务器用ntpd同步GPS时间服务器的案例

本文记录了openEuler 22.03 (LTS-SP1)的二级时间服务器用chronyd不能自动同步GPS时间服务器&#xff0c;改用ntpd同步GPS时间服务器成功的案例 一、环境简述 1、本环境中有两台GPS一级时间服务器&#xff0c;IP如下&#xff1a; 192.168.188.66 192.168.188.74 2、有一台o…

交易中的特殊存在

在交易的广袤天空中&#xff0c;有一群特殊的存在——他们&#xff0c;是Eagle Trader。 他们以鹰眼般的洞察力&#xff0c;捕捉市场的微妙变化&#xff0c;每一次决策都如同猎食者般精准&#xff1b;他们运用策略&#xff0c;如同雄鹰在风中翱翔&#xff0c;利用风向&#xf…

3dsMax怎样让渲染效果更逼真出色?三套低中高参数设置

渲染是将精心构建的3D模型转化为逼真图像的关键步骤。但要获得令人惊叹的渲染效果&#xff0c;仅仅依赖默认设置是不够的。 实现在追求极致画面效果的同时&#xff0c;兼顾渲染速度和时间还需要进行一些调节设置&#xff0c;如何让渲染效果更加逼真&#xff1f; 一、全局照明与…

AI播客下载:The Gradient-AI前沿见解

The Gradient 是一个致力于让更多人轻松了解人工智能&#xff0c;并促进人工智能社区内讨论的组织。我们目前开展的项目包括 The Gradient 杂志、The Gradient 播客、The Update 通讯以及 Mastodon 实例 Sigmoid Social。 我们是一个由来自不同机构和公司的研究生、研究人员及…