mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 16:41:02 +02:00
improve algorithm and fix issues
This commit is contained in:
parent
32a43d5549
commit
a9ebe22072
1 changed files with 62 additions and 44 deletions
|
@ -306,57 +306,75 @@ MultiSphereShape::CollapsingMode MultiSphereShape::getNextCollapsingMode(Extract
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (collapseCount > 0) {
|
if (collapseCount > 0) {
|
||||||
collapseVector = glm::normalize(collapseVector);
|
float collapseDistance = glm::length(collapseVector);
|
||||||
bool perfectAxis = collapseVector.x != 1.0f && collapseVector.y != 1.0f && collapseVector.z != 1.0f;
|
bool allSpheresCollapse = collapseDistance < EPSILON;
|
||||||
int halfSphere3DCount = 4;
|
if (allSpheresCollapse) {
|
||||||
int halfSphere2DCount = 2;
|
|
||||||
bool modeSpheres3D = mode == ExtractionMode::SpheresXYZ;
|
|
||||||
bool modeSpheres2D = mode == ExtractionMode::SpheresXY ||
|
|
||||||
mode == ExtractionMode::SpheresYZ ||
|
|
||||||
mode == ExtractionMode::SpheresXZ;
|
|
||||||
bool modeSpheres1D = mode == ExtractionMode::SpheresX ||
|
|
||||||
mode == ExtractionMode::SpheresY ||
|
|
||||||
mode == ExtractionMode::SpheresZ;
|
|
||||||
bool collapseToSphere = !perfectAxis || (modeSpheres3D && collapseCount > halfSphere3DCount) ||
|
|
||||||
(modeSpheres2D && collapseCount > halfSphere2DCount) ||
|
|
||||||
modeSpheres1D;
|
|
||||||
if (collapseToSphere) {
|
|
||||||
collapsingMode = CollapsingMode::Sphere;
|
collapsingMode = CollapsingMode::Sphere;
|
||||||
} else if (collapseVector.x == 1.0f) {
|
} else {
|
||||||
if (modeSpheres3D) {
|
collapseVector = glm::normalize(collapseVector);
|
||||||
collapsingMode = CollapsingMode::SpheresYZ;
|
bool alongAxis = collapseVector.x == 1.0f || collapseVector.y == 1.0f || collapseVector.z == 1.0f;
|
||||||
} else if (modeSpheres2D) {
|
bool alongPlane = collapseVector.x == 0.0f || collapseVector.y == 0.0f || collapseVector.z == 0.0f;
|
||||||
if (mode == ExtractionMode::SpheresXY) {
|
int halfSphere3DCount = 4;
|
||||||
collapsingMode = CollapsingMode::SpheresY;
|
int halfSphere2DCount = 2;
|
||||||
} else if (mode == ExtractionMode::SpheresXZ) {
|
bool modeSpheres3D = mode == ExtractionMode::SpheresXYZ;
|
||||||
collapsingMode = CollapsingMode::SpheresZ;
|
bool modeSpheres2D = mode == ExtractionMode::SpheresXY ||
|
||||||
|
mode == ExtractionMode::SpheresYZ ||
|
||||||
|
mode == ExtractionMode::SpheresXZ;
|
||||||
|
bool modeSpheres1D = mode == ExtractionMode::SpheresX ||
|
||||||
|
mode == ExtractionMode::SpheresY ||
|
||||||
|
mode == ExtractionMode::SpheresZ;
|
||||||
|
// SpheresXYZ will collapse along XY YZ XZ planes or X Y Z axes.
|
||||||
|
// SpheresXY, SpheresYZ and Spheres XZ will collapse only along X Y Z axes.
|
||||||
|
// Other occurences will be collapsed to a single sphere.
|
||||||
|
bool isCollapseValid = (modeSpheres3D && (alongAxis || alongPlane)) ||
|
||||||
|
(modeSpheres2D && (alongAxis));
|
||||||
|
bool collapseToSphere = !isCollapseValid || (modeSpheres3D && collapseCount > halfSphere3DCount) ||
|
||||||
|
(modeSpheres2D && collapseCount > halfSphere2DCount) ||
|
||||||
|
modeSpheres1D;
|
||||||
|
if (collapseToSphere) {
|
||||||
|
collapsingMode = CollapsingMode::Sphere;
|
||||||
|
} else if (modeSpheres3D) {
|
||||||
|
if (alongAxis) {
|
||||||
|
if (collapseVector.x == 1.0f) {
|
||||||
|
collapsingMode = CollapsingMode::SpheresYZ;
|
||||||
|
} else if (collapseVector.y == 1.0f) {
|
||||||
|
collapsingMode = CollapsingMode::SpheresXZ;
|
||||||
|
} else if (collapseVector.z == 1.0f) {
|
||||||
|
collapsingMode = CollapsingMode::SpheresXY;
|
||||||
|
}
|
||||||
|
} else if (alongPlane) {
|
||||||
|
if (collapseVector.x == 0.0f) {
|
||||||
|
collapsingMode == CollapsingMode::SpheresX;
|
||||||
|
} else if (collapseVector.y == 0.0f) {
|
||||||
|
collapsingMode == CollapsingMode::SpheresY;
|
||||||
|
} else if (collapseVector.z == 0.0f) {
|
||||||
|
collapsingMode == CollapsingMode::SpheresZ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else if (collapseVector.y == 1.0f) {
|
|
||||||
if (modeSpheres3D) {
|
|
||||||
collapsingMode = CollapsingMode::SpheresXZ;
|
|
||||||
} else if (modeSpheres2D) {
|
} else if (modeSpheres2D) {
|
||||||
if (mode == ExtractionMode::SpheresXY) {
|
if (collapseVector.x == 1.0f) {
|
||||||
collapsingMode = CollapsingMode::SpheresX;
|
if (mode == ExtractionMode::SpheresXY) {
|
||||||
} else if (mode == ExtractionMode::SpheresYZ) {
|
collapsingMode = CollapsingMode::SpheresY;
|
||||||
collapsingMode = CollapsingMode::SpheresZ;
|
} else if (mode == ExtractionMode::SpheresXZ) {
|
||||||
}
|
collapsingMode = CollapsingMode::SpheresZ;
|
||||||
}
|
}
|
||||||
} else if (collapseVector.z == 1.0f) {
|
} else if (collapseVector.y == 1.0f) {
|
||||||
if (modeSpheres3D) {
|
if (mode == ExtractionMode::SpheresXY) {
|
||||||
collapsingMode = CollapsingMode::SpheresXY;
|
collapsingMode = CollapsingMode::SpheresX;
|
||||||
} else if (modeSpheres2D) {
|
} else if (mode == ExtractionMode::SpheresYZ) {
|
||||||
if (mode == ExtractionMode::SpheresXZ) {
|
collapsingMode = CollapsingMode::SpheresZ;
|
||||||
collapsingMode = CollapsingMode::SpheresX;
|
}
|
||||||
} else if (mode == ExtractionMode::SpheresYZ) {
|
} else if (collapseVector.z == 1.0f) {
|
||||||
collapsingMode = CollapsingMode::SpheresY;
|
if (mode == ExtractionMode::SpheresXZ) {
|
||||||
|
collapsingMode = CollapsingMode::SpheresX;
|
||||||
|
} else if (mode == ExtractionMode::SpheresYZ) {
|
||||||
|
collapsingMode = CollapsingMode::SpheresY;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qCDebug(physics) << "Multisphere collapsing from mode: " << modeToString(mode) << " to mode: "
|
|
||||||
<< modeToString(collapsingMode) << " Joint: " << _jointName;
|
|
||||||
}
|
}
|
||||||
return collapsingMode;
|
return collapsingMode;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue