forked from SarahWeiii/CoACD
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodel_obj.h
101 lines (88 loc) · 3.11 KB
/
model_obj.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#pragma once
#include <algorithm>
#include <assert.h>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
#include <cstdlib>
#include <time.h>
#include <assert.h>
#include <algorithm>
#include <set>
#include <map>
#include <unordered_map>
#include "shape.h"
#include "sobol.h"
#include "config.h"
#include "logger.h"
using namespace std;
namespace coacd
{
/* Copyright to V-HACD */
struct Material
{
float m_diffuseColor[3];
float m_ambientIntensity;
float m_specularColor[3];
float m_emissiveColor[3];
float m_shininess;
float m_transparency;
Material(void)
{
m_diffuseColor[0] = 0.5f;
m_diffuseColor[1] = 0.5f;
m_diffuseColor[2] = 0.5f;
m_specularColor[0] = 0.5f;
m_specularColor[1] = 0.5f;
m_specularColor[2] = 0.5f;
m_ambientIntensity = 0.4f;
m_emissiveColor[0] = 0.0f;
m_emissiveColor[1] = 0.0f;
m_emissiveColor[2] = 0.0f;
m_shininess = 0.4f;
m_transparency = 0.5f;
};
};
class Model
{
public:
double bbox[6];
// double m_len, g_len;
// double m_Xmid, m_Ymid, m_Zmid;
double barycenter[3];
array<array<double, 3>, 3> m_rot;
vector<vec3d> points;
vector<vec3i> triangles;
Model();
bool CheckThin();
bool LoadOBJ(const string &fileName);
bool Load(vector<vec3d> vertices, vector<vec3i> face_indices);
void SaveOBJ(const string &fileName);
array<array<double, 3>, 3> PCA();
vector<double> Normalize();
void Recover(vector<double> _bbox);
void RevertPCA(array<array<double, 3>, 3> rot);
void Clear();
void GetEigenValues(array<array<double, 3>, 3> eigen_values);
void AlignToPrincipalAxes();
bool IsManifold();
void ExtractPointSet(vector<vec3d> &samples, vector<int> &sample_tri_ids, unsigned int seed = 1235, size_t resolution = 2000, double base = 0, bool flag = false, Plane plane = Plane(0, 0, 0, 0));
vector<vec3d> GetPoints(size_t resolution);
double *GetBBox() { return bbox; }
void ComputeCH(Model &convex);
void ComputeVCH(Model &convex);
};
double MeshArea(Model &mesh);
double MeshVolume(Model &mesh);
void RecoverParts(vector<Model> &meshes, vector<double> bbox, array<array<double, 3>, 3> rot, Params ¶ms);
bool ComputeOverlapFace(Model &convex1, Model &convex2, Plane &plane);
void ExtractPointSet(Model convex1, Model convex2, unsigned int seed, vector<vec3d> &samples, size_t resolution = 4000);
void ExtractPointSet(Model &convex1, Model &convex2, vector<vec3d> &samples, vector<int> &sample_tri_ids, unsigned int seed, size_t resolution);
void WritePointSet(const string &fileName, vector<vec3d> &samples);
void MergeMesh(Model &mesh1, Model &mesh2, Model &merge);
}