CARLA
 
载入中...
搜索中...
未找到
Simplification.cpp
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// 简化
5//
6// This work is licensed under the terms of the MIT license.
7// For a copy, see <https://opensource.org/licenses/MIT>.
8
10#include "simplify/Simplify.h"
11
12// 定义在carla和geom命名空间下,这里应该是实现与几何图形简化相关的功能模块
13namespace carla {
14namespace geom {
15// 简化函数,对给定的网格进行简化
16 void Simplification::Simplificate(const std::unique_ptr<geom::Mesh>& pmesh){
17 // 创建一个简化对象
19 // 将输入网格的顶点转换为简化对象的顶点格式,并添加到简化对象中
20 for (carla::geom::Vector3D& current_vertex : pmesh->GetVertices()) {
22 // 将当前顶点的 x 坐标赋值给简化对象顶点格式中的对应分量,完成数据的拷贝转换。
23 v.p.x = current_vertex.x;
24 v.p.y = current_vertex.y;
25 v.p.z = current_vertex.z;
26 Simplification.vertices.push_back(v);
27 }
28 // 将输入网格的索引转换为简化对象的三角形格式,并添加到简化对象中
29 for (size_t i = 0; i < pmesh->GetIndexes().size() - 2; i += 3) {
31 t.material = 0;
32 // 获取输入网格的索引列表,以便后续构建三角形的顶点索引关系。
33 auto indices = pmesh->GetIndexes();
34 // 根据索引确定三角形的第一个顶点在顶点列表中的位置,注意这里减 1 可能是因为索引的计数方式在不同数据结构中的差异(比如从 0 开始还是从 1 开始等)。
35 t.v[0] = (indices[i]) - 1;
36 t.v[1] = (indices[i + 1]) - 1;
37 t.v[2] = (indices[i + 2]) - 1;
38 Simplification.triangles.push_back(t);
39 }
40
41 // 减少到多边形的 X%
42 float target_size = Simplification.triangles.size();
43 // 执行简化操作,将三角形数量减少到目标大小
44 // 执行简化操作,调用 Simplify::SimplificationObject 的 simplify_mesh 方法,传入根据简化比例计算出的目标三角形数量,
45 // 这个方法内部应该实现了具体的网格简化算法,例如基于边折叠(Edge Collapse)等常见图形学简化算法,通过合理地去除一些顶点和边(在这个函数中体现为三角形数量的减少)来简化网格模型,
46 // 同时尽量保持模型的外观特征等重要信息,类似于在图结构中通过一些规则合并节点、删除边来简化图的表示,同时保留关键拓扑信息。
47 Simplification.simplify_mesh((target_size * simplification_percentage));
48// 清空输入网格的顶点和索引列表
49 pmesh->GetVertices().clear();
50 pmesh->GetIndexes().clear();
51// 将简化后的顶点转换回输入网格的顶点格式,并添加到输入网格中
52 for (Simplify::Vertex& current_vertex : Simplification.vertices) {
54 v.x = current_vertex.p.x;
55 v.y = current_vertex.p.y;
56 v.z = current_vertex.p.z;
57 pmesh->AddVertex(v);
58 }
59// 将简化后的索引转换回输入网格的索引格式,并添加到输入网格中
60 // 以下循环将简化后 Simplify::SimplificationObject 中的索引数据(三角形的顶点索引关系)转换回输入网格(pmesh)的索引格式,并添加回输入网格中。
61 // 同样是将经过简化后重新组织的三角形面片信息(通过索引体现)更新到原始的网格数据结构中,完成整个网格简化后的数据更新操作,使得输入网格对象 pmesh 最终保存的是简化后的模型数据。
62
63 for (size_t i = 0; i < Simplification.triangles.size(); ++i) {
64 pmesh->GetIndexes().push_back((Simplification.triangles[i].v[0]) + 1);
65 pmesh->GetIndexes().push_back((Simplification.triangles[i].v[1]) + 1);
66 pmesh->GetIndexes().push_back((Simplification.triangles[i].v[2]) + 1);
67 }
68 }
69
70} // namespace geom
71} // namespace carla
用于简化网格的类。
Definition Simplify.h:829
void Simplificate(const std::unique_ptr< geom::Mesh > &pmesh)
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
表示三角形的数据结构。
Definition Simplify.h:762
int v[3]
三角形的三个顶点索引。
Definition Simplify.h:766
int material
材质索引。
Definition Simplify.h:786
表示顶点的数据结构。
Definition Simplify.h:794
vec3f p
顶点位置。
Definition Simplify.h:798
double y
Definition Simplify.h:135
double z
Definition Simplify.h:135
double x
Definition Simplify.h:135