Override inertia of body with visual geoms if discardvisual is true.
Fixes #2546. PiperOrigin-RevId: 742650702 Change-Id: I753c1e1c89da732ece100676644bbecf9d6373bb
This commit is contained in:
committed by
Copybara-Service
parent
86c970bc23
commit
648a03c2cf
+26
-5
@@ -558,7 +558,7 @@ void mjCModel::RemoveFromList(std::vector<T*>& list, const mjCModel& other) {
|
|||||||
template <>
|
template <>
|
||||||
void mjCModel::DeleteAll<mjCKey>(std::vector<mjCKey*>& elements) {
|
void mjCModel::DeleteAll<mjCKey>(std::vector<mjCKey*>& elements) {
|
||||||
for (mjCKey* element : elements) {
|
for (mjCKey* element : elements) {
|
||||||
delete element;
|
element->Release();
|
||||||
}
|
}
|
||||||
elements.clear();
|
elements.clear();
|
||||||
}
|
}
|
||||||
@@ -1553,7 +1553,7 @@ static void DeleteElements(std::vector<T*>& elements,
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
for (int j=0; j < elements.size(); j++) {
|
for (int j=0; j < elements.size(); j++) {
|
||||||
if (discard[j]) {
|
if (discard[j]) {
|
||||||
delete elements[j];
|
elements[j]->Release();
|
||||||
} else {
|
} else {
|
||||||
elements[i] = elements[j];
|
elements[i] = elements[j];
|
||||||
i++;
|
i++;
|
||||||
@@ -1611,7 +1611,7 @@ void mjCModel::DeleteAll<mjCMaterial>(std::vector<mjCMaterial*>& elements) {
|
|||||||
DeleteMaterial(sites_);
|
DeleteMaterial(sites_);
|
||||||
DeleteMaterial(tendons_);
|
DeleteMaterial(tendons_);
|
||||||
for (mjCMaterial* element : elements) {
|
for (mjCMaterial* element : elements) {
|
||||||
delete element;
|
element->Release();
|
||||||
}
|
}
|
||||||
elements.clear();
|
elements.clear();
|
||||||
}
|
}
|
||||||
@@ -1621,7 +1621,7 @@ template <>
|
|||||||
void mjCModel::DeleteAll<mjCTexture>(std::vector<mjCTexture*>& elements) {
|
void mjCModel::DeleteAll<mjCTexture>(std::vector<mjCTexture*>& elements) {
|
||||||
DeleteAllTextures(materials_);
|
DeleteAllTextures(materials_);
|
||||||
for (mjCTexture* element : elements) {
|
for (mjCTexture* element : elements) {
|
||||||
delete element;
|
element->Release();
|
||||||
}
|
}
|
||||||
elements.clear();
|
elements.clear();
|
||||||
}
|
}
|
||||||
@@ -1781,7 +1781,6 @@ void mjCModel::IndexAssets(bool discard) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// discard visual meshes and geoms
|
|
||||||
if (discard) {
|
if (discard) {
|
||||||
std::vector<bool> discard_mesh(meshes_.size(), false);
|
std::vector<bool> discard_mesh(meshes_.size(), false);
|
||||||
std::vector<bool> discard_geom(geoms_.size(), false);
|
std::vector<bool> discard_geom(geoms_.size(), false);
|
||||||
@@ -1795,6 +1794,28 @@ void mjCModel::IndexAssets(bool discard) {
|
|||||||
return geom->IsVisual();
|
return geom->IsVisual();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// update inertia in bodies
|
||||||
|
for (auto body : bodies_) {
|
||||||
|
if (body->spec.explicitinertial) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (auto geom : body->geoms) {
|
||||||
|
if (geom->IsVisual()) {
|
||||||
|
if (compiler.inertiafromgeom == mjINERTIAFROMGEOM_TRUE) {
|
||||||
|
compiler.inertiafromgeom = mjINERTIAFROMGEOM_AUTO;
|
||||||
|
}
|
||||||
|
body->explicitinertial = true; // for XML writer
|
||||||
|
body->spec.explicitinertial = true;
|
||||||
|
body->spec.mass = body->mass;
|
||||||
|
mjuu_copyvec(body->spec.ipos, body->ipos, 3);
|
||||||
|
mjuu_copyvec(body->spec.iquat, body->iquat, 4);
|
||||||
|
mjuu_copyvec(body->spec.inertia, body->inertia, 3);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// discard visual meshes and geoms
|
||||||
Delete(meshes_, discard_mesh);
|
Delete(meshes_, discard_mesh);
|
||||||
Delete(geoms_, discard_geom);
|
Delete(geoms_, discard_geom);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1976,16 +1976,6 @@ void mjCBody::Compile(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if discarding visual geoms, use explicit inertias
|
|
||||||
if (compiler->discardvisual) {
|
|
||||||
for (int j=0; j < geoms.size(); j++) {
|
|
||||||
if (geoms[j]->IsVisual()) {
|
|
||||||
explicitinertial = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// free joint alignment, phase 2 (transform sites, cameras and lights)
|
// free joint alignment, phase 2 (transform sites, cameras and lights)
|
||||||
if (align_free) {
|
if (align_free) {
|
||||||
// frames have already been compiled and applied to children
|
// frames have already been compiled and applied to children
|
||||||
|
|||||||
@@ -520,8 +520,7 @@ TEST_F(PluginTest, RecompileCompare) {
|
|||||||
// if file is meant to fail, skip it
|
// if file is meant to fail, skip it
|
||||||
if (absl::StrContains(p.path().string(), "malformed_") ||
|
if (absl::StrContains(p.path().string(), "malformed_") ||
|
||||||
absl::StrContains(p.path().string(), "touch_grid") ||
|
absl::StrContains(p.path().string(), "touch_grid") ||
|
||||||
absl::StrContains(p.path().string(), "cow") ||
|
absl::StrContains(p.path().string(), "cow")) {
|
||||||
absl::StrContains(p.path().string(), "discardvisual")) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user