[Bf-blender-cvs] [9fdc5345cd] uv_unwrapping_slim_algorithm: merging master into release

Aurel Gruber noreply at git.blender.org
Thu Mar 23 16:46:35 CET 2017


Commit: 9fdc5345cde7381747c465e09bb404a749a34b06
Author: Aurel Gruber
Date:   Thu Mar 23 16:44:22 2017 +0100
Branches: uv_unwrapping_slim_algorithm
https://developer.blender.org/rB9fdc5345cde7381747c465e09bb404a749a34b06

merging master into release

===================================================================

M	intern/slim/area_compensation.h
M	intern/slim/geometry_data_retrieval.h
M	intern/slim/intern/area_compensation.cpp
M	intern/slim/intern/geometry_data_retrieval.cpp
M	intern/slim/intern/least_squares_relocator.cpp
M	intern/slim/intern/slim.cpp
M	intern/slim/intern/slim_capi.cpp
M	intern/slim/intern/slim_parametrizer.cpp
M	intern/slim/intern/uv_initializer.cpp
M	intern/slim/slim.h
M	intern/slim/slim_capi.h
M	intern/slim/slim_parametrizer.h
M	intern/slim/uv_initializer.h
M	source/blender/editors/uvedit/uvedit_parametrizer.c
M	source/blender/editors/uvedit/uvedit_parametrizer.h
M	source/blender/editors/uvedit/uvedit_unwrap_ops.c

===================================================================

diff --git a/intern/slim/area_compensation.h b/intern/slim/area_compensation.h
index d44bdc1961..9469fcca20 100644
--- a/intern/slim/area_compensation.h
+++ b/intern/slim/area_compensation.h
@@ -35,5 +35,5 @@ using namespace igl;
 
 namespace areacomp {
 	void correctMapSurfaceAreaIfNecessary(SLIMData *slimData);
-	void correctMeshSurfaceAreaIfNecessary(SLIMData *slimData, double relative_scale = 1.0);
+	void correctMeshSurfaceAreaIfNecessary(SLIMData *slimData);
 }
diff --git a/intern/slim/geometry_data_retrieval.h b/intern/slim/geometry_data_retrieval.h
index 21c7658233..2af4fce8e4 100644
--- a/intern/slim/geometry_data_retrieval.h
+++ b/intern/slim/geometry_data_retrieval.h
@@ -67,7 +67,7 @@ namespace retrieval {
 		double weightInfluence;
 	};
 
-	void constructSlimData(GeometryData &gd, SLIMData *slimData, bool skipInitialization, int slim_reflection_mode);
+	void constructSlimData(GeometryData &gd, SLIMData *slimData, bool skipInitialization, int slim_reflection_mode, double relativeScale);
 
 	void retrievePinnedVertices(GeometryData &gd, bool borderVerticesArePinned);
 
diff --git a/intern/slim/intern/area_compensation.cpp b/intern/slim/intern/area_compensation.cpp
index f755e48c61..040cfae950 100644
--- a/intern/slim/intern/area_compensation.cpp
+++ b/intern/slim/intern/area_compensation.cpp
@@ -70,7 +70,7 @@ namespace areacomp {
 		correctGeometrySize(resultingAreaToExpectedAreaRatio, slimData->V_o, desiredRatio);
 	}
 
-	void correctMeshSurfaceAreaIfNecessary(SLIMData *slimData, double relative_scale){
+	void correctMeshSurfaceAreaIfNecessary(SLIMData *slimData){
 		int numberOfPinnedVertices = slimData->b.rows();
 		bool pinnedVerticesExist = numberOfPinnedVertices > 0;
 		bool needsAreaCorrection = 	slimData->skipInitialization || pinnedVerticesExist;
@@ -78,7 +78,7 @@ namespace areacomp {
 		if(!needsAreaCorrection){
 			return;
 		}
-		//TODO: should instead compare area of convex hull / size of convex hull of both major and minor axis
+
 		double areaOfPreinitializedMap = computeSurfaceArea(slimData->V_o, slimData->F);
 		if (!areaOfPreinitializedMap){
 			return;
@@ -92,7 +92,7 @@ namespace areacomp {
 		double surfaceAreaOf3DMesh = computeSurfaceArea(slimData->V, slimData->F);
 		double surfaceAreaToMapAreaRatio = surfaceAreaOf3DMesh / areaOfPreinitializedMap;
 
-		double desiredRatio = relative_scale;
+		double desiredRatio = 1.0;
 		correctGeometrySize(surfaceAreaToMapAreaRatio, slimData->V, desiredRatio);
 	}
 }
diff --git a/intern/slim/intern/geometry_data_retrieval.cpp b/intern/slim/intern/geometry_data_retrieval.cpp
index 6a8fac223b..5cc418be15 100644
--- a/intern/slim/intern/geometry_data_retrieval.cpp
+++ b/intern/slim/intern/geometry_data_retrieval.cpp
@@ -97,9 +97,10 @@ namespace retrieval {
 		return (skipInitialization && hasValidPreinitializedMap(gd));
 	}
 
-	void constructSlimData(GeometryData &gd, SLIMData *slimData, bool skipInitialization, int slim_reflection_mode){
+	void constructSlimData(GeometryData &gd, SLIMData *slimData, bool skipInitialization, int slim_reflection_mode, double relativeScale){
 		slimData->skipInitialization = canInitializationBeSkipped(gd, skipInitialization);
 		slimData->weightInfluence = gd.weightInfluence;
+		slimData->relativeScale = relativeScale;
 		slimData->slim_reflection_mode = slim_reflection_mode;
 		slimData->withWeightedParameterization = gd.withWeightedParameteriztion;
 		setGeometryDataMatrices(gd, slimData);
diff --git a/intern/slim/intern/least_squares_relocator.cpp b/intern/slim/intern/least_squares_relocator.cpp
index 91ed146146..5ed0e80437 100644
--- a/intern/slim/intern/least_squares_relocator.cpp
+++ b/intern/slim/intern/least_squares_relocator.cpp
@@ -69,142 +69,6 @@ namespace relocator {
 
 	}
 
-	void catchZeroSingularValue(Vector2d &singularValues, const int largerIndex, const int smallerIndex){
-		if (singularValues(smallerIndex) == 0){
-			cout << "caught zero valued singular value" << endl;
-			singularValues(smallerIndex) = singularValues(largerIndex)/20;
-		}
-	}
-
-	void orderSingularValues(Vector2d &singularValues, int &largerIndex, int &smallerIndex){
-		if (abs(singularValues(smallerIndex)) > abs(singularValues(largerIndex))){
-			largerIndex = 1 - largerIndex;
-			smallerIndex = 1 - smallerIndex;
-		}
-	}
-
-	/**
-	 * The resulting transformation from a generic least squares relocation can lead to 
-	 * - zero valued singular values (e.g. if all pins are on the same line)
-	 * - extrem difference in singular values
-	 * - reflections of the input (may or may not be acceptable)
-	 *
-	 * This function handles these issues
-	 */
-	void adjustSVD(SLIMData &slimData, Matrix2d &transformationMatrix){
-
-		JacobiSVD<Matrix2d> svd(transformationMatrix, ComputeFullU | ComputeFullV);
-		Vector2d singularValues = svd.singularValues();
-		int largerScaleFactor = 0;
-		int smallerScaleFactor = 1;
-
-		orderSingularValues(singularValues, largerScaleFactor, smallerScaleFactor);
-
-		catchZeroSingularValue(singularValues, largerScaleFactor, smallerScaleFactor);
-
-		double scaleFactorDifference = abs(singularValues(largerScaleFactor)) / abs(singularValues(smallerScaleFactor));
-
-		if (scaleFactorDifference > 20){
-			cout << "limiting SVD scale factor difference" << endl;
-			double scaleFactorCompensation = scaleFactorDifference/20;
-			singularValues(smallerScaleFactor) *= scaleFactorCompensation;
-		}
-
-		transformationMatrix = svd.matrixU() * singularValues.asDiagonal() * svd.matrixV().transpose();
-	}
-
-	/*
-	 X has the following structure:
-	 
-	| x_1 y_1  0   0   1   0|
-	|  .   .   .   .   .   .|
-	|  .   .   .   .   .   .|
-	| x_n y_n  0   0   1   0|
-	|  0   0  x_1 y_1  0   1|
-	|  .   .   .   .   .   .|
-	|  .   .   .   .   .   .|
-	|  0   0  x_n y_n  0   1|
-
-	 */
-	void computeMatrixX(SLIMData &slimData, MatrixXd &X){
-		int numberOfPinnedVertices = slimData.b.rows();
-
-		MatrixXd positionOfPinnedVerticesInInitialization(numberOfPinnedVertices, 2);
-		VectorXd onesVector = VectorXd::Ones(numberOfPinnedVertices);
-
-		retrievePositionsOfPinnedVerticesInInitialization(slimData.V_o,
-														  slimData.b,
-														  positionOfPinnedVerticesInInitialization);
-
-		X.block(0, 0, numberOfPinnedVertices, 2) = positionOfPinnedVerticesInInitialization;
-		X.block(numberOfPinnedVertices, 2, numberOfPinnedVertices, 2) = positionOfPinnedVerticesInInitialization;
-
-		X.block(0, 4, numberOfPinnedVertices, 1) = onesVector;
-		X.block(numberOfPinnedVertices, 5, numberOfPinnedVertices, 1) = onesVector;
-	}
-
-
-	/*
-	 Finds transformation matrix
-
-	 T = |a b|
-	 	 |c d|
-
-	 and translation vector
-
-	 s = |e|
-	     |f|
-
-	 s.t. if to each point p in the inizialized map the following is applied
-
-	 T*p + s
-
-	 we get the closest transformation of the positions of the vertices in the initialized map to the pinned vertices
-	 in a least squares sense. We find them by solving
-
-	 argmin_{t}	Xt = p
-
-	 i.e.:
-
-	 | x_1 y_1  0   0   1   0|           |u_1|
-	 |  .   .   .   .   .   .|   |T11|   | . |
-	 |  .   .   .   .   .   .|   |T12|   | . |
-	 | x_n y_n  0   0   1   0|   |T21|   |u_n|
-	 |  0   0  x_1 y_1  0   1| * |T22| = |v_1|
-	 |  .   .   .   .   .   .|   |s_1|   | . |
-	 |  .   .   .   .   .   .|   |s_2|   | . |
-	 |  0   0  x_n y_n  0   1|           |v_n|
-
-	 t is of dimension 1 x 6 and p of dimension 2*numberOfPinnedVertices x 1 
-	 is the vector holding the uv positions of the pinned vertices.
-	 */
-
-	void computeLeastSquaresTransformation(SLIMData &slimData,
-										   Vector2d &translationVector,
-										   Matrix2d &transformationMatrix){
-		int numberOfPinnedVertices = slimData.b.rows();
-
-		MatrixXd X = MatrixXd::Zero(numberOfPinnedVertices * 2, 6);
-		computeMatrixX(slimData, X);
-
-		VectorXd p(2 * numberOfPinnedVertices);
-		p.head(numberOfPinnedVertices) = slimData.bc.block(0,0,numberOfPinnedVertices,1);
-		p.tail(numberOfPinnedVertices) = slimData.bc.block(0,1,numberOfPinnedVertices,1);;
-
-		VectorXd t = X.colPivHouseholderQr().solve(p);
-		transformationMatrix.row(0) = t.head(2);
-		transformationMatrix.row(1) = t.segment(2,2);
-
-		translationVector = t.tail(2);
-
-		adjustSVD(slimData, transformationMatrix);
-
-		bool containsReflection = transformationMatrix.determinant() < 0;
-		if (containsReflection){
-			flipInputGeometry(slimData);
-		}
-	}
-
 	void computeCentroid(MatrixXd &pointCloud, Vector2d &centroid){
 		centroid << pointCloud.col(0).sum(), pointCloud.col(1).sum();
 		centroid /= pointCloud.rows();
@@ -259,8 +123,9 @@ namespace relocator {
 	}
 
 	void computLeastSquaresRotationScaleOnly(SLIMData &slimData,
-								   Vector2d &translationVector,
-								   Matrix2d &transformationMatrix){
+											 Vector2d &translationVector,
+											 Matrix2d &transformationMatrix,
+											 bool isFlipAllowed){
 
 		MatrixXd positionOfInitializedPins(slimData.b.rows(), 2);
 		retrievePositionsOfPinnedVerticesInInitialization(slimData.V_o,
@@ -283,7 +148,15 @@ namespace relocator {
 		Matrix2d VU_T = svd.matrixV() * svd.matrixU().transpose();
 
 		Matrix2d singularValues = Matrix2d::Identity();
-		singularValues(1,1) = VU_T.determinant();
+
+		bool containsReflection = VU_T.determinant() < 0;
+		if (containsReflection) {
+			if (!isFlipAllowed) {
+				singularValues(1,1) = VU_T.determinant();
+			} else {
+				flipInputGeometry(slimData);
+			}
+		}
 
 		computeLeastSquaresScaling(centeredpins,
 									   centeredInitializedPins,
@@ -337,15 +210,12 @@ namespace relocator {
 				break;
 			default:
 
-				if (slimData.slim_reflection_mode == 0){
-					computeLeastSquaresTransformation(slimData,
-													  translationVector,
-													  transformationMatrix);
-				} else {
-					computLeastSquaresRotationScaleOnly(slimData,
-											   			translationVector,
-											   			transformationMatrix);
-				}
+				bool flipAllowed = slimData.slim_reflection_mode == 0;
+
+				computLeastSquaresRotationScaleOnly(slimData,
+													translationVector,
+													transformationMatrix,
+													flipAllowed);
 
 				applyTransformation(slimData, transformationMatrix);
 				applyTranslation(slimData, translationVector);
diff --git a/intern/slim/intern/slim.cpp b/intern/slim/intern/slim.cpp


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list