[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