三维模型表面积计算方法

【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。

更多算法总结请关注我的博客:https://blog.csdn.net/suiyingy,或”乐乐感知学堂“公众号。
本文章来自于专栏《Python三维模型处理基础》的系列文章,专栏地址为:https://blog.csdn.net/suiyingy/category_12462636.html。  

        在当今数字化时代,三维模型已经广泛应用于各个领域,如游戏开发、建筑设计、工程制图等。了解三维模型的表面积以及其计算方法,对于模型的几何特征分析和后续处理具有重要意义。本篇博文将带您深入了解三维模型表面积的定义、作用以及计算方法。

1 表面积定义

        三维模型表面积是指模型所有外部表面的总面积。在数学上,它可以被视为一个多边形网格的组合,由许多个平面三角形组成。每个三角形都有自己的面积,将它们相加即可得到整个模型的表面积。

2 表面积作用

        几何特征分析:表面积可以用于对三维模型的几何特征进行分析和描述。通过表面积,我们可以了解模型的大小、形状以及精细程度,从而为后续的评估和改进工作提供基础数据。

        光照和渲染:在计算机图形学中,光照和渲染是模拟真实世界的重要步骤。表面积决定了模型的各个部分可以接收到多少光线,从而影响最终的视觉效果。计算表面积有助于优化渲染过程,提高图像质量和真实感。

        物理仿真:在物理仿真中,表面积对于计算模型的质量、密度以及碰撞检测等方面非常重要。通过对表面积的计算,可以更准确地模拟模型的物理行为,提高仿真的准确性和真实度。

        此外,上一节介绍的三维模型顶点法向量计算过程中加权求和的权重也由表面积来决定。

3 计算方法

        计算三维模型表面积的方法有多种,这里介绍两种常用的方法,即多边形网格法和曲面拟合法。

        多边形网格法的步骤为:

        (1)首先,将三维模型表示为一个由多个小三角形组成的多边形网格。

        (2)计算每个三角形的面积,可以使用海伦公式或矢量运算等方法。

        (3)将所有三角形的面积相加,得到整个模型的表面积。

        曲面拟合法的步骤为:

        (1)首先,将三维模型表面离散化为一系列点云。

        (2)使用曲面拟合算法,如Bezier曲线或B样条曲线,将点云拟合成光滑的曲面。

        (3)计算拟合曲面的表面积。

        需要注意的是,计算三维模型表面积的精确度与离散化程度相关。较为密集的网格或点云将提供更准确的结果,但也会增加计算复杂度和存储需求。

4 python示例程序

        4.1 单个三角面

        这里我们仍然采用trimesh和open3d来计算三维模型的表面积。我们首先以单个三角面为例,假设顶点坐标分别为[[0.0, 0.0, 1.0], [3.0, 0.0, 1.0], [0.0, 4.0, 1.0]]。显然,这是一个直角三角形,其面积为1/2 * 3 * 4 = 6。

        Trimesh计算三维模型表面积的函数为mesh.area,上述三角面的计算结果为6.0,与预期理论结果一致。关键程序如下所示。

mesh = trimesh.Trimesh(vertices=vertices, faces=faces)
print('area result: ', mesh.area)

        Open3d计算三维模型表面积的函数为open3d.geometry.TriangleMesh.get_surface_area (Python method, in open3d.geometry.TriangleMesh),上述三角面的计算结果为6.0,与预期理论结果一致。关键程序如下所示。

mesh.vertices = o3d.utility.Vector3dVector(vertices)
mesh.triangles = o3d.utility.Vector3iVector(faces)
print('area result: ', mesh.get_surface_area())

        4.2 三棱柱表面积

        假设三棱柱顶点和三角网格面分别为[[0.0, 0.0, 0.0], [3.0, 0.0, 0.0], [0.0, 4.0, 0.0], [0.0, 0.0, 5.0], [3.0, 0.0, 5.0], [0.0, 4.0, 5.0]]、[[1, 3, 2], [2, 3, 5], [5, 3, 6], [1, 4, 3], [3, 4, 6], [1, 2, 4], [2, 5, 4], [4, 5, 6]]。三棱柱示意图如下所示,底面是一个直角三角形。上下底面的面积均为6.0,三个侧面的面积依次为15.0、20.0、25.0,因此总面积为72.0。

图1 三棱柱模型

        Trimesh和open3d相应表面积计算结果均为72.0。之前的博文介绍提到,三维模型的体积计算结果受到顶点顺序和封闭性影响。而三维模型的表面积则不受顶点顺序影响,并且仅计算三角网格的面积之和,孔洞不会自动补全或参与计算。

        Trimesh可通过mesh.area_faces来获取各个三角面的面积,例如上述三棱柱对应的area_faces的计算结果为[ 6.  12.5 12.5 10.  10.   7.5  7.5  6. ]。

        上述计算结果的详细Python示例程序下载地址为“https://download.csdn.net/download/suiyingy/88457956”,或者在”乐乐感知学堂“內回复”3d处理基础“即可。

        此外,Cloud Compare也提供三维模型的表面积计算方法,其计算步骤为:首先加载并选中mesh模型,然后依次点击Edit->Mesh->Measure surface,如下图所示。

图2 Could Compare表面积计算过程

        表面积计算结果会显示在下方提示区域,如下图所示。三棱柱表面积计算结果为S=72,与上述手动计算结果一致。

图3 Could Compare表面积计算结果

        本篇博文介绍了三维模型表面积的定义、作用以及常用的计算方法。了解三维模型的表面积对于模型分析、渲染和仿真具有重要意义。通过计算表面积,我们可以更深入地理解三维模型的几何特征,并为相关领域的应用提供有力支持。希望本文能够帮助读者更好地理解和应用三维模型表面积的知识。

【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。

更多算法总结请关注我的博客:https://blog.csdn.net/suiyingy,或”乐乐感知学堂“公众号。
本文章来自于专栏《Python三维模型处理基础》的系列文章,专栏地址为:https://blog.csdn.net/suiyingy/category_12462636.html。

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

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

相关文章

Unity 文字显示动画(2)

针对第一版的优化,自动适配文字大小,TextMeshPro可以拓展各种语言。第一版字母类语言效果更好。 using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI;public partial class TextBeat…

Android 10.0 Launcher3定制化之动态时钟图标功能实现

1.概述 在10.0的系统产品rom定制化开发中,在Launcher3中的定制化的一些功能中,对于一些产品要求需要实现动态时钟图标功能,这就需要先绘制时分秒时针表盘,然后 每秒刷新一次时钟图标,时钟需要做到实时更新,做到动态时钟的效果,接下来就来分析这个功能的实现 如图: 2.动…

LoadRunner录制脚本+编写脚本

LoadRunner安装* 为什么选择LoadRunner 1)Jmeter没有录制功能 2)可以设计非常非常丰富的测试场景 3)LoadRunner能够产出非常丰富的测试报告 LoadRunner三大组件的关系 每个组件是干什么的 VUG:录制脚本,&#xff…

[CSP-S 2023] 种树 —— 二分+前缀和

This way 题意: 一开始以为是水题,敲了一个二分贪心检查的代码,20分。发现从根往某个节点x走的时候,一路走来的子树上的节点到已栽树的节点的距离会变短,那么并不能按照初始情况贪心。 于是就想着检查时候用线段树…

C++对象模型(19)-- 函数语义学:成员函数

1、普通成员函数的调用 1.1 调用方式的转换 为了提高普通成员函数的调用效率,在C中,对普通成员函数的调用,会转换成对全局函数的调用。 假如有下面所示的成员函数: class Test { public:int m_i;int func(int a) {m_i a;retu…

【C++】类型转换

一、C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化。 C语言中总共有两种形式的类型转换:隐式类型转换和显式…

【三】kubernetes kuboard部署分布式系统

#服务器 #部署 #云原生 #k8s 目录 一、前言二、搭建docker私有仓库三、系统搭建1、NFS部署1)部署nfs server (192.168.16.200)2)部署nfs client (全部节点)3)在Kuboard中创建 NFS 存储类 2、创建命名空间3、添加docker密文4、创建…

解决 Could not build wheels for pandas, which is required to install pyproject.toml-based projects

最近在学习李沐老师的深度学习的课程,在安装 d2l 时, pip install d2l0.17.6遇到了问题: ERROR: Could not build wheels for pandas, which is required to install pyproject.toml-based projects 由于我忘记截错误的图了,在论…

基于SSM的图书商城网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Linux下Samba服务安装及启用全攻略

Linux下Samba服务安装及启用全攻略 前言一、安装SSH Server二、安装Samba Server1.安装net-tool2.建立账号的samba3.windows通过Samba与linux共享文件4.使用远程工具登录Linux 总结 前言 提示:本文详解了在Linux系统下如何安装和启用Samba服务,涵盖了从…

5、Kafka集成 SpringBoot

SpringBoot 是一个在 JavaEE 开发中非常常用的组件。可以用于 Kafka 的生产者,也可以 用于 SpringBoot 的消费者。 1)在 IDEA 中安装 lombok 插件 在 Plugins 下搜索 lombok 然后在线安装即可,安装后注意重启 2)SpringBoot 环境准…

三十七、【进阶】SQL的explain

1、explain 2、基础使用 在使用explain关键字时,只需要在所执行语句前加上explain即可 mysql> explain select * from stu where id3; ---------------------------------------------------------------------------------------------------------- | id | s…

shell学习脚本04(小滴课堂)

他就可以直接读出来了。不需要在sh后面加参数。 可以用-s隐藏内容: 可以用-t进行指定几秒后显示。 -n限制内容长度。 输入到长度为5自动打印。 我们把-s放到-p后面的话: 这样会出错。 如果最后加5m会一直闪烁。 大家可以按照需求自行使用。

Qt第六十五章:自定义菜单栏的隐藏、弹出

目录 一、效果图 二、qtDesigner 三、ui文件如下: 四、代码 一、效果图 二、qtDesigner 原理是利用属性动画来控制QFrame的minimumWidth属性。 ①先拖出相应的控件 ②布局一下 ③填上一些样式 相关QSS background-color: rgb(238, 242, 255); border:2px sol…

雪数据同化系统Snow Data Assimilation System数据集

雪数据同化系统(SNODAS) 雪资料同化系统(SNODAS)是国家水文遥感业务中心(NOHRSC)精心开发的综合建模和资料同化系统。其主要目标是提供高度准确的积雪和相关参数估计,作为水文建模和分析的重要…

如何正确维护实验室超声波清洗机

实验室一直被视作一个严谨且严肃的场所,在其中所做的试验都需要遵照一定流程,所用的设备也经过了细致化挑选,例如实验室超声波清洗机,其性能远强于普通类别的清洗机。专门负责采购的实验室人员,通常会对质量优服务好的…

居民小区电动汽车有序充电策略研究

摘 要:针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题,提出一种采用延迟充电的电动汽车有序充电控制策略,并在分析国内外电动汽车有序充电的研究现状后,设计了居民小区电动汽车有序充电策略的总体框架。…

Linux常用命令——clock命令

在线Linux命令查询工具 clock 用于调整 RTC 时间。 补充说明 clock命令用于调整 RTC 时间。 RTC 是电脑内建的硬件时间,执行这项指令可以显示现在时刻,调整硬件时钟的时间,将系统时间设成与硬件时钟之时间一致,或是把系统时间…

【网络爬虫 | Python】数字货币ok链上bitcoin大额交易实时爬取,存入 mysql 数据库

文章目录 一、网站分析二、js 逆向获取 X-Apikey三、python 调用 js 获取 X-Apikey四、python 爬虫部分五、mysql 数据库、日志、配置文件、目录结构六、结尾 一、网站分析 oklink:https://www.oklink.com/ btc 大额交易:https://www.oklink.com/btc/tx-…

初始Redis 分布式结构的发展演变

目录 Redis的特点和使用场景 分布式系统的引入 单机系统 分布式系统 应用服务器的增多(处理更多的请求) 数据库读写分离(数据服务器的增多) 引入缓存 应对更大的数据量 业务拆分:微服务 Redis的特点和使用场景 我们先来…