[Bf-blender-cvs] [5681b886a02] uv_unwrapping_slim_algorithm: UV Unwrapping SLIM: refactoring UVInitializer
Aurel Gruber
noreply at git.blender.org
Tue Mar 14 09:43:08 CET 2017
Commit: 5681b886a02586404a8919314ad99875608c600b
Author: Aurel Gruber
Date: Thu Mar 9 13:31:19 2017 +0100
Branches: uv_unwrapping_slim_algorithm
https://developer.blender.org/rB5681b886a02586404a8919314ad99875608c600b
UV Unwrapping SLIM: refactoring UVInitializer
===================================================================
M intern/SLIM/src/UVInitializer.cpp
M intern/SLIM/src/UVInitializer.h
M intern/SLIM/src/slim_parametrizer.cpp
M release/datafiles/locale
M release/scripts/addons
M release/scripts/addons_contrib
M source/tools
===================================================================
diff --git a/intern/SLIM/src/UVInitializer.cpp b/intern/SLIM/src/UVInitializer.cpp
index 339dcc6c3d5..34513f31957 100644
--- a/intern/SLIM/src/UVInitializer.cpp
+++ b/intern/SLIM/src/UVInitializer.cpp
@@ -17,9 +17,7 @@
using namespace std;
double computeAngle(const Eigen::Vector3d &a,const Eigen::Vector3d &b){
- cout << "points for angle " << a << " and " << b << endl;
- double angle = acos(a.dot(b) / (a.norm() * b.norm()));
- return angle;
+ return acos(a.dot(b) / (a.norm() * b.norm()));
}
void findVertexToOppositeAnglesCorrespondence(const Eigen::MatrixXi &F,const Eigen::MatrixXd &V, Eigen::SparseMatrix<double> &vertexToFaceIndices){
@@ -37,10 +35,6 @@ void findVertexToOppositeAnglesCorrespondence(const Eigen::MatrixXi &F,const Eig
double angle2 = computeAngle(V.row(vertexIndex3) - V.row(vertexIndex2), V.row(vertexIndex1) - V.row(vertexIndex2));
double angle3 = computeAngle(V.row(vertexIndex1) - V.row(vertexIndex3), V.row(vertexIndex2) - V.row(vertexIndex3));
- cout << "vertex " << V.row(vertexIndex1) << " has angle " << angle1 << "for neighbors " << V.row(vertexIndex2) << " and" << V.row(vertexIndex3) << endl << endl;
- cout << "vertex " << V.row(vertexIndex2) << " has angle " << angle2 << "for neighbors " << V.row(vertexIndex3) << " and" << V.row(vertexIndex1) << endl << endl;
- cout << "vertex " << V.row(vertexIndex3) << " has angle " << angle3 << "for neighbors " << V.row(vertexIndex1) << " and" << V.row(vertexIndex2) << endl << endl;
-
coefficients.push_back(T(vertexIndex1, 2*vertexIndex2, angle3));
coefficients.push_back(T(vertexIndex1, 2*vertexIndex3 + 1, angle2));
@@ -84,14 +78,17 @@ void findVertexToItsAnglesCorrespondence(const Eigen::MatrixXi &F,const Eigen::M
vertexToFaceIndices.setFromTriplets(coefficients.begin(), coefficients.end());
}
-/* AUREL THESIS
- My own implementation of unfirom laplacian parameterization, for speed comparison and curiosity. Mine is faster then the libigl implementation.
- Unfortunatly it is a very bad initialisation for our use.
+/*
+ Implementation of different fixed-border parameterizations, Mean Value Coordinates, Harmonic, Tutte.
*/
-void UVInitializer::uniform_laplacian(const Eigen::MatrixXi &F, const Eigen::MatrixXd &V, const Eigen::MatrixXi &E, const Eigen::VectorXd &EL, const Eigen::VectorXi &bnd, Eigen::MatrixXd &bnd_uv, Eigen::MatrixXd &UV, Eigen::MatrixXd &CotMatrix){
-
- enum Method{TUTTE, HARMONIC, MVC};
- Method method = HARMONIC;
+void UVInitializer::convex_border_parameterization(const Eigen::MatrixXi &F,
+ const Eigen::MatrixXd &V,
+ const Eigen::MatrixXi &E,
+ const Eigen::VectorXd &EL,
+ const Eigen::VectorXi &bnd,
+ const Eigen::MatrixXd &bnd_uv,
+ Eigen::MatrixXd &UV,
+ Method method){
int nVerts = UV.rows();
int nEdges = E.rows();
@@ -152,8 +149,6 @@ void UVInitializer::uniform_laplacian(const Eigen::MatrixXi &F, const Eigen::Mat
break;
}
- cout << "edgeWeight " << edgeWeight << "r.norm: "<< edgeLength << endl;
-
intTripletVector.push_back(Eigen::Triplet<double>(rowindex, rowindex, edgeWeight));
if (secondVertex >= nKnowns){ // also an unknown point in the interior
@@ -176,18 +171,12 @@ void UVInitializer::uniform_laplacian(const Eigen::MatrixXi &F, const Eigen::Mat
Abnd.setFromTriplets(bndTripletVector.begin(), bndTripletVector.end());
Abnd.makeCompressed();
- //cout << "Aint before: " << endl << Aint.toDense() << endl;
- //cout << "Abnd before: " << endl << Abnd.toDense() << endl;
-
for (int i = 0; i < nUnknowns; i++){
double factor = Aint.coeff(i, i);
Aint.row(i) /= factor;
Abnd.row(i) /= factor;
}
- //cout << "Aint: " << endl << Aint.toDense() << endl;
- //cout << "Abnd: " << endl << Abnd.toDense() << endl;
-
Eigen::SparseLU<Eigen::SparseMatrix<double>> solver;
solver.compute(Aint);
@@ -209,16 +198,38 @@ void UVInitializer::uniform_laplacian(const Eigen::MatrixXi &F, const Eigen::Mat
}
}
-void UVInitializer::harmonic(const Eigen::MatrixXd &V,
- const Eigen::MatrixXi &F,
- const Eigen::MatrixXi &B,
- const Eigen::MatrixXd &bnd_uv,
- int powerOfHarmonicOperaton,
- Eigen::MatrixXd &UV){
+void UVInitializer::mvc(const Eigen::MatrixXi &F,
+ const Eigen::MatrixXd &V,
+ const Eigen::MatrixXi &E,
+ const Eigen::VectorXd &EL,
+ const Eigen::VectorXi &bnd,
+ const Eigen::MatrixXd &bnd_uv,
+ Eigen::MatrixXd &UV){
- igl::harmonic(V, F, B, bnd_uv, powerOfHarmonicOperaton, UV);
+ UVInitializer::convex_border_parameterization(F, V, E, EL, bnd, bnd_uv, UV, Method::MVC);
}
+void UVInitializer::harmonic(const Eigen::MatrixXi &F,
+ const Eigen::MatrixXd &V,
+ const Eigen::MatrixXi &E,
+ const Eigen::VectorXd &EL,
+ const Eigen::VectorXi &bnd,
+ const Eigen::MatrixXd &bnd_uv,
+ Eigen::MatrixXd &UV){
+
+ UVInitializer::convex_border_parameterization(F, V, E, EL, bnd, bnd_uv, UV, Method::HARMONIC);
+}
+
+void UVInitializer::tutte(const Eigen::MatrixXi &F,
+ const Eigen::MatrixXd &V,
+ const Eigen::MatrixXi &E,
+ const Eigen::VectorXd &EL,
+ const Eigen::VectorXi &bnd,
+ const Eigen::MatrixXd &bnd_uv,
+ Eigen::MatrixXd &UV){
+
+ UVInitializer::convex_border_parameterization(F, V, E, EL, bnd, bnd_uv, UV, Method::TUTTE);
+}
void get_flips(const Eigen::MatrixXd& V,
const Eigen::MatrixXi& F,
const Eigen::MatrixXd& uv,
diff --git a/intern/SLIM/src/UVInitializer.h b/intern/SLIM/src/UVInitializer.h
index 83536c745ac..b1771a2e4ba 100644
--- a/intern/SLIM/src/UVInitializer.h
+++ b/intern/SLIM/src/UVInitializer.h
@@ -6,26 +6,55 @@
//
//
-#ifndef UVInitializer_hpp
-#define UVInitializer_hpp
+#ifndef UVInitializer_h
+#define UVInitializer_h
#include <stdio.h>
#include <Eigen/Dense>
#include <Eigen/Sparse>
-#endif /* UVInitializer_hpp */
+
+enum Method{TUTTE, HARMONIC, MVC};
namespace UVInitializer {
- void uniform_laplacian(const Eigen::MatrixXi &F,
- const Eigen::MatrixXd &V,
- const Eigen::MatrixXi &E,
- const Eigen::VectorXd &EL,
- const Eigen::VectorXi &bnd,
- Eigen::MatrixXd &bnd_uv,
- Eigen::MatrixXd &UV,
- Eigen::MatrixXd &CotMatrix);
+
+ void convex_border_parameterization(const Eigen::MatrixXi &F,
+ const Eigen::MatrixXd &V,
+ const Eigen::MatrixXi &E,
+ const Eigen::VectorXd &EL,
+ const Eigen::VectorXi &bnd,
+ const Eigen::MatrixXd &bnd_uv,
+ Eigen::MatrixXd &UV,
+ Method method);
+
+ void mvc(
+ const Eigen::MatrixXi &F,
+ const Eigen::MatrixXd &V,
+ const Eigen::MatrixXi &E,
+ const Eigen::VectorXd &EL,
+ const Eigen::VectorXi &bnd,
+ const Eigen::MatrixXd &bnd_uv,
+ Eigen::MatrixXd &UV);
+
+ void harmonic(
+ const Eigen::MatrixXi &F,
+ const Eigen::MatrixXd &V,
+ const Eigen::MatrixXi &E,
+ const Eigen::VectorXd &EL,
+ const Eigen::VectorXi &bnd,
+ const Eigen::MatrixXd &bnd_uv,
+ Eigen::MatrixXd &UV);
+
+ void tutte(
+ const Eigen::MatrixXi &F,
+ const Eigen::MatrixXd &V,
+ const Eigen::MatrixXi &E,
+ const Eigen::VectorXd &EL,
+ const Eigen::VectorXi &bnd,
+ const Eigen::MatrixXd &bnd_uv,
+ Eigen::MatrixXd &UV);
void harmonic(const Eigen::MatrixXd &V,
const Eigen::MatrixXi &F,
@@ -38,3 +67,5 @@ namespace UVInitializer {
const Eigen::MatrixXi& F,
const Eigen::MatrixXd& uv);
}
+
+#endif /* UVInitializer_h */
diff --git a/intern/SLIM/src/slim_parametrizer.cpp b/intern/SLIM/src/slim_parametrizer.cpp
index d06c5ccfb33..be6feffc401 100644
--- a/intern/SLIM/src/slim_parametrizer.cpp
+++ b/intern/SLIM/src/slim_parametrizer.cpp
@@ -94,34 +94,14 @@ void initializeUvs(retrieval::GeometryData &gd, SLIMData *slimData){
Eigen::MatrixXd CotMatrix;
igl::cotmatrix_entries(Eigen::MatrixXd(gd.vertexPositions3D), Eigen::MatrixXi(gd.facesByVertexindices), CotMatrix);
- UVInitializer::uniform_laplacian(
-gd.facesByVertexindices,
- gd.vertexPositions3D,
- gd.edgesByVertexindices,
- gd.edgeLengths,
- boundaryVertexIndices,
- uvPositionsOfBoundary,
- slimData->V_o,
- CotMatrix);
-
- /*
- int harmonicPower = 1; // 1 is harmonic map, 2 is biharmonic ...
- UVInitializer::harmonic(vertexPositions2D,
- facesByVertexIndices,
- boundaryVertexIndices,
- uvPositionsOfBoundary,
- harmonicPower,
- slimData->V_o);
-
- bool flippedTrianglesInMap = UVInitializer::count_flips(slimData->V, slimData->F, slimData->V_o) > 0;
-
- if (flippedTrianglesInMap) { // fallback to lower-quality, guaranteed-to-be flip free method
- UVInitializer::uniform_laplacian(gd.edgesByVertexindices,
- gd.edgeLengths,
- boundaryVertexIndices,
- uvPositionsOfBoundary,
- slimData->V_o);
- }*/
+ UVInitializer::mvc(
+ gd.facesByVertexindices,
+ gd.vertexPositions3D,
+ gd.edgesByVertexindices,
+ gd.edgeLengths,
+ boundaryVertexIndices,
+ uvPositionsOfBoundary,
+ slimData->V_o);
}
void initializeIfNeeded(retrieval::GeometryData &gd, SLIMData *slimData){
diff --git a/release/datafiles/locale b/release/datafiles/locale
index dc166057192..507eacde960 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit dc166057192ea882b5cc70484d4c8bacd7cb41b4
+Subproject commit 507eacde9608ce0190c6087fb338dd63f7a1649b
diff --git a/release/scripts/addons b/release/scripts/addons
index 06dad53c808..ff8ef5cb121 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 06dad53c80801e0e0919f086040e3d9c31bbd0a1
+Subproject commit ff8ef5cb121e590ef1a5f3e5f57b9bf99c46559d
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 04af69be141..e0e0fe92738 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 04af69be141a5757fc60b44cc1a5b72db524af30
+Subproject commit e0e0fe92738e345746ef566b6ecfb79d28a28d6d
diff --git a/source/tools b/source/tools
index 896c5f78952..b11375e8906 160000
--- a/source/tools
+++ b/source
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list