[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 ¢roid){
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