CURAENGINE的Mesh类

一、Mesh类

类Mesh代表了一个三维网格(mesh),它是3D图形和建模中常见的数据结构。具体来说,它包含以下主要功能和数据:

class Mesh
{
    //! The vertex_hash_map stores a index reference of each vertex for the hash of that location. Allows for quick retrieval of points with the same location.
    std::unordered_map<uint32_t, std::vector<uint32_t> > vertex_hash_map;
    AABB3D aabb;
public:
    std::vector<MeshVertex> vertices;//!< list of all vertices in the mesh
    std::vector<MeshFace> faces; //!< list of all faces in the mesh
    Settings settings;
    std::string mesh_name;

    Mesh(Settings& parent);
    Mesh();

    void addFace(Point3& v0, Point3& v1, Point3& v2); //!< add a face to the mesh without settings it's connected_faces.
    void clear(); //!< clears all data
    void finish(); //!< complete the model : set the connected_face_index fields of the faces.

    Point3 min() const; //!< min (in x,y and z) vertex of the bounding box
    Point3 max() const; //!< max (in x,y and z) vertex of the bounding box
    AABB3D getAABB() const; //!< Get the axis aligned bounding box
    void expandXY(int64_t offset); //!< Register applied horizontal expansion in the AABB
    
    /*!
     * Offset the whole mesh (all vertices and the bounding box).
     * \param offset The offset byu which to offset the whole mesh.
     */
    void offset(Point3 offset)
    {
        if (offset == Point3(0,0,0)) { return; }
        for(MeshVertex& v : vertices)
            v.p += offset;
        aabb.offset(offset);
    }

private:
    mutable bool has_disconnected_faces; //!< Whether it has been logged that this mesh contains disconnected faces
    mutable bool has_overlapping_faces; //!< Whether it has been logged that this mesh contains overlapping faces
    int findIndexOfVertex(const Point3& v); //!< find index of vertex close to the given point, or create a new vertex and return its index.

    /*!
     * Get the index of the face connected to the face with index \p notFaceIdx, via vertices \p idx0 and \p idx1.
     * 
     * In case multiple faces connect with the same edge, return the next counter-clockwise face when viewing from \p idx1 to \p idx0.
     * 
     * \param idx0 the first vertex index
     * \param idx1 the second vertex index
     * \param notFaceIdx the index of a face which shouldn't be returned
     * \param notFaceVertexIdx should be the third vertex of face \p notFaceIdx.
     * \return the face index of a face sharing the edge from \p idx0 to \p idx1
    */
    int getFaceIdxWithPoints(int idx0, int idx1, int notFaceIdx, int notFaceVertexIdx) const;
};

顶点(Vertices)和面(Faces)相关成员:

1、vertices:一个包含所有网格顶点的std::vector。每个MeshVertex可能包含位置、颜色、纹理坐标等信息。
2、faces:一个包含所有网格面的std::vector。每个MeshFace可能包含构成该面的顶点索引和可能的其他信息(如法线、纹理坐标索引等)。
3、设置(Settings):
settings:一个Settings对象,包含与网格相关的各种设置或属性。
网格名称(Mesh Name):
4、mesh_name:一个字符串,用于标识或命名这个特定的网格。

顶点(Vertices)和面(Faces)相关成员方法:

1、添加面(Add Face):
addFace方法允许你添加一个新的面到网格中,给定三个顶点的位置。
2、清除数据(Clear):
clear方法会清除所有的顶点和面数据。
3、完成模型(Finish):
finish方法用于设置面之间的连接关系或进行其他后处理步骤的。
4、边界框(Bounding Box):
aabb:一个AABB3D对象,表示网格的轴对齐边界框(Axis-Aligned Bounding Box)。它有助于快速确定哪些对象可能与给定位置相交,常用于碰撞检测或视锥体裁剪。
5、方法
min和max方法分别返回边界框的最小和最大顶点。
getAABB方法返回边界框对象本身。
expandXY方法允许你在X和Y方向上扩展边界框。
偏移(Offset):
offset方法允许你移动整个网格(包括其所有顶点和边界框)给定的偏移量。
错误状态(Error States):
has_disconnected_faceshas_overlapping_faces是两个布尔值,用于跟踪网格是否包含未连接的面或重叠的面。这可能是为了在后续处理中报告或处理这些问题。

二、Mesh::addFace函数

void Mesh::addFace(Point3& v0, Point3& v1, Point3& v2)
{
    int vi0 = findIndexOfVertex(v0);
    int vi1 = findIndexOfVertex(v1);
    int vi2 = findIndexOfVertex(v2);
    if (vi0 == vi1 || vi1 == vi2 || vi0 == vi2) return; // the face has two vertices which get assigned the same location. Don't add the face.

    int idx = faces.size(); // index of face to be added
    faces.emplace_back();
    MeshFace& face = faces[idx];
    face.vertex_index[0] = vi0;
    face.vertex_index[1] = vi1;
    face.vertex_index[2] = vi2;
    vertices[face.vertex_index[0]].connected_faces.push_back(idx);
    vertices[face.vertex_index[1]].connected_faces.push_back(idx);
    vertices[face.vertex_index[2]].connected_faces.push_back(idx);
}

这个函数Mesh::addFace是Mesh类中的一个方法,用于向网格中添加一个新的面。下面我将详细解释这个函数的工作原理:

参数
Point3& v0, Point3& v1, Point3& v2:这三个参数是三个Point3类型的引用,分别表示新面的三个顶点的位置。

step 1、查找顶点索引:

findIndexOfVertex(v0), findIndexOfVertex(v1), findIndexOfVertex(v2):这三个调用是假设Mesh类中存在一个未在此代码段中定义的findIndexOfVertex方法,用于查找给定顶点在vertices向量中的索引。如果顶点已经存在,则返回其索引;如果不存在,可能会添加顶点并返回新索引(但此函数的具体实现并未给出)。

step 2、检查顶点是否重复:

如果新面的三个顶点中有任何两个顶点索引相同(即它们指向相同的顶点位置),则不添加该面,并直接返回。这是为了避免在网格中创建具有重复顶点的面。
添加新面:
int idx = faces.size();:获取当前faces向量的大小,即新面将被添加的索引。
faces.emplace_back();:在faces向量的末尾使用emplace_back方法构造一个新面(假设MeshFace有一个接受默认参数的构造函数)。
MeshFace& face = faces[idx];:通过索引获取新添加的面的引用,以便后续操作。

step 3、设置面的顶点索引:

使用face.vertex_index[0], face.vertex_index[1], face.vertex_index[2]为新面的三个顶点设置索引。这些索引指向vertices向量中的顶点。
更新顶点的连接面列表:
每个顶点都有一个connected_faces列表用于存储与该顶点相连的所有面的索引。对于新添加的面的每个顶点,都将该面的索引添加到其connected_faces列表中。这样,后续可以通过遍历顶点的connected_faces列表来找到所有与该顶点相连的面。
总之,Mesh::addFace函数的主要目的是将一个新面添加到网格中,并确保顶点的连接面列表得到正确更新。

三、Mesh::findIndexOfVertex函数

int Mesh::findIndexOfVertex(const Point3& v)
{
    uint32_t hash = pointHash(v);

    for(unsigned int idx = 0; idx < vertex_hash_map[hash].size(); idx++)
    {
        if ((vertices[vertex_hash_map[hash][idx]].p - v).testLength(vertex_meld_distance))
        {
            return vertex_hash_map[hash][idx];
        }
    }
    vertex_hash_map[hash].push_back(vertices.size());
    vertices.emplace_back(v);
    
    aabb.include(v);
    
    return vertices.size() - 1;
}

这个函数 Mesh::findIndexOfVertex 用于在 Mesh 类中查找给定顶点 v 的索引,如果顶点不存在,则将其添加到 vertices 向量中并返回新索引。以下是该函数的详细解释:

参数:
const Point3& v:这是一个常量引用,指向要查找或添加的 Point3 类型的顶点。
计算顶点哈希值:
uint32_t hash = pointHash(v);:使用 pointHash 函数(该函数未在提供的代码段中定义)计算顶点 v 的哈希值。这个哈希值用于在 vertex_hash_map 中快速查找顶点。
在哈希映射中查找顶点:
遍历 vertex_hash_map[hash] 容器,这是一个包含具有相同哈希值的所有顶点索引的 std::vector<uint32_t>
对于容器中的每个索引,使用 vertices[index].p 访问相应的顶点,并检查它与给定顶点 v 是否在 vertex_meld_distance 范围内(这里 testLength 是一个方法,用于比较两点之间的距离是否小于或等于 vertex_meld_distance)。
如果找到匹配的顶点,则返回该顶点的索引。

添加新顶点:

如果在哈希映射中没有找到匹配的顶点,则将当前 vertices 向量的大小(即新顶点的索引)添加到 vertex_hash_map[hash] 中。
使用 vertices.emplace_back(v) 将新顶点 v 添加到 vertices 向量的末尾。

更新边界框:

aabb.include(v);:调用 AABB3D 对象的 include 方法(假设该方法存在)以将新顶点 v 包含到网格的轴对齐边界框(AABB)中。
返回新索引:
返回新添加的顶点在 vertices 向量中的索引,即 vertices.size() - 1。

注意:

vertex_meld_distance 是一个成员变量或常量,用于确定两个顶点是否“距离足够短”以至于可以被认为是相同的。这通常用于网格优化,例如顶点合并或焊接。
testLength 方法是 Point3 类的一个成员函数,用于比较两个点之间的距离是否小于或等于给定的阈值。
vertex_hash_map 是一个哈希映射,用于通过哈希值快速查找顶点索引,从而提高查找效率。如果两个顶点具有相同的哈希值但实际上是不同的(哈希冲突),则通过比较顶点位置来解决冲突。
AABB3D 是另一个类,用于表示和操作轴对齐边界框。include 方法用于更新边界框以包含新的顶点。

总结

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

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

相关文章

企业年中宣传的几个核心点

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 过了五一小长假&#xff0c;就来到了夏天&#xff0c;在生机勃勃的春天里&#xff0c;我们定好了全年的宣传计划&#xff0c;包括要举行哪些活动&#xff0c;参加哪些展会&#xff0c;一…

ADS过孔---过孔建模自动化

当前快速建模的方法有两类&#xff1a;一是脚本自动化&#xff0c;也就是今天要分享的方法&#xff0c;但该方法需要工程师有基本的脚本编辑能力&#xff0c;然后根据自己的需要去修改&#xff0c;难度较大一点点&#xff1b;二是参数化建模&#xff0c;也就是在GUI界面输入相应…

Milvus向量数据库(一)Milvus存储byte[]类型源向量数据

两种路线&#xff1a; 第一种是把byte[]转换为List< float >&#xff0c;然后存储到Milvus的floatVector中第二种是把byte[]转换为ByteBuffer&#xff0c;然后存储到Milvus的BinaryVector中 步骤&#xff1a; 我先用的是第一种&#xff0c;但是在转换float过程中&…

Java Stream A

1. Stream API概述 Java 8 Stream是Java 8中引入的一个新的API&#xff0c;用于处理集合和数组等数据结构的元素。它允许您在数据集上进行功能性操作&#xff0c;例如过滤、映射、排序等&#xff0c;而不需要编写循环或迭代器等底层代码。 Java 8 Stream与集合不同&#xff0c;…

信息系统项目管理师——成本管理计算专题(二)

绩效监测和成本预算 SV&#xff0c;CV&#xff0c;SPI&#xff0c;CPI都是以EV开头&#xff0c;用EV去减或者用EV去除&#xff0c;如果是S指标那么就是减 PV 或除PV&#xff0c;如果是C指标那么就是减AC 或除 AC。 如果题目只是问当前的进度或成本绩效状态&#xff0c;那么只需…

wangEditor 富文本详解

前言&#xff1a;wangEditor 官网 。本文档讲解 wangEditor 在 vue3 中的使用。 一&#xff1a;快速开始 1. 安装 需要安装 wangeditor/editor、wangeditor/editor-for-vuenext 两个依赖 # 安装 editor npm install wangeditor/editor # or yarn add wangeditor/editor # o…

【前端】输入时字符跳动动画实现

输入时字符跳动动画实现 在前端开发中&#xff0c;为了提升用户体验&#xff0c;我们经常需要为用户的交互行为提供即时的反馈。这不仅让用户知道他们的操作有了响应&#xff0c;还可以让整个界面看起来更加生动、有趣。本文将通过一个简单的例子讲解如何实现在用户输入字符时…

Linux实验 Linux操作基础

实验目的&#xff1a; 掌握Linux系统登录模式的切换&#xff1b;掌握Linux系统的注销与关闭&#xff1b;掌握Linux系统Shell简单命令&#xff1b;掌握Linux系统Shell命令的基础操作及高级操作。 实验内容&#xff1a; 在VMware中启动已经安装好的CentOS&#xff0c;在下图登录…

全域团购外卖怎么样,哪家全域运营系统好?

当前&#xff0c;全域团购外卖逐渐兴起&#xff0c;全域团购外卖怎么样等问题也逐渐成为人们热议的焦点。事实上&#xff0c;从理论上来说&#xff0c;全域团购外卖确实大有可为&#xff0c;全域团购外卖运营服务商的收益也非常值得期待&#xff01; 首先&#xff0c;就团购外卖…

测试人员在面试时的注意事项

一、技术方面面试 在某种程度上来说&#xff0c;技术面试重要到能够决定你是否被聘用。在技术岗位方面&#xff0c;在个人品德没有问题的前提下&#xff0c;招聘公司对技术是最关心的。 我现在并不能给你分析具体的面试题&#xff0c;因为与笔试题相比&#xff0c;面试题千变万…

封装js方法实现无缝循环滚动效果

如下图&#xff0c;又遇到了无缝循环滚动这个需求 突然想到我之前有分享过一篇关于这个的文章https://blog.csdn.net/chuenst/article/details/137125377&#xff0c;果断打开csdn准备cv 经过我一顿操作&#xff0c;很快实现了需求&#xff0c;但是这风扇直接嗡嗡转&#xff0c…

Dropout作为贝叶斯近似: 表示深度学习中的模型不确定性

摘要 深度学习工具在应用机器学习领域受到了极大的关注。然而&#xff0c;这些用于回归和分类的工具并没有捕捉到模型的不确定性。相比之下&#xff0c;贝叶斯模型提供了一个基于数学的框架来推理模型的不确定性&#xff0c;但通常会带来令人望而却步的计算成本。本文提出了一…

Vue3工程化配置

Vue3工程化配置 目录 Vue3工程化配置创建项目vue-clivite(推荐) 快速体验2和3的差别vue3vue2 ref和reactive 创建项目 vue-cli 具体环境配置请点这里 记得新建配置时这里选vue3 vite(推荐) 注&#xff1a;Vite 需要 Node.js 版本 18&#xff0c;20 1.选定路径后再cmd输入创建…

ScienceDirect文献如何下载

ScienceDirect是爱思唯尔公司的全文数据库平台&#xff0c;是全球最大的科学、技术与医学全文电子资源数据库&#xff0c;是我们在查找外文文献常用的数据库。但是&#xff0c;ScienceDirect数据库的文献是需要使用权限才可获取的。如果你没有该数据库资源要如何查询下载文献呢…

likeshop多商户单商户商城_likeshop跑腿源码_likeshop物品租赁系统开源版怎么配置小程序对接?

本人是商业用户所以能持续得到最新商业版&#xff0c;今天我说下likeshop里面怎么打包小程序&#xff0c;大家得到程序时候会发现它有admin目录 app目录 server目录 这三个目录分别是做什么呢&#xff1f; 1.admin目录 下面都是架构文件使用得是Node.js打包得&#xff0c;至于…

教你快速记录每日待办事项,并提醒自己按时完成不忘记

在忙碌的日常生活中&#xff0c;我们经常会面临待办事项繁杂、时间紧迫的困扰。为了更高效地管理时间和任务&#xff0c;我们需要一个能够快速记录并准时提醒我们完成待办事项的工具。此时&#xff0c;敬业签这类的待办软件就成为了很多人的首选工具。 敬业签是一款功能强大的…

信息系统项目管理师0091:项目经理的能力(6项目管理概论—6.3项目经理的角色—6.3.3项目经理的能力)

点击查看专栏目录 文章目录 6.3.3项目经理的能力1.概述2.项目管理技能3.战略和商务管理技能4.领导力技能5.领导力与管理记忆要点总结6.3.3项目经理的能力 1.概述 项目经理需要重点关注三个方面的关键技能包括项目管理、战略和商务、领导力

合肥先进光源束测步进电机控制机箱接线方式

合肥先进光源束测步进电机控制方案介绍 对上篇文里的接线方式做个修订&#xff1a; EtherCat电机控制机箱接线规范 驱动器 控制器 接线方式 使用鸣志 STF05-ECX-H驱动器&#xff0c;每个机箱配8个驱动器使用汇川的H5U-1614MTD etherCat控制器每个驱动器的电源从2分8的分配端子…

AJ-Report开源数据大屏远程命令执行漏洞

文章目录 描述漏洞原理影响版本漏洞复现修复方案 描述 AJ-Report是全开源的一个BI平台&#xff0c;酷炫大屏展示&#xff0c;能随时随地掌控业务动态&#xff0c;让每个决策都有数据支撑。     多数据源支持&#xff0c;内置mysql、elasticsearch、kudu驱动&#xff0c;支持…

Linux基本指令(下下)

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 本篇博客续我之前的Linux指令&#xff08;下&a…
最新文章