Read normals and textures from OBJ, do not duplicate vertices.
PiperOrigin-RevId: 510461549 Change-Id: I19245d691e722a8371e61153383f275f599353d6
This commit is contained in:
committed by
Copybara-Service
parent
35967a30d9
commit
9756ed0d80
Vendored
BIN
Binary file not shown.
Vendored
+8
@@ -0,0 +1,8 @@
|
||||
<mujoco>
|
||||
<asset>
|
||||
<mesh file="cube.msh"/>
|
||||
</asset>
|
||||
<worldbody>
|
||||
<geom type="mesh" mesh="cube"/>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
@@ -32,6 +32,8 @@ namespace {
|
||||
|
||||
using MjCMeshTest = MujocoTest;
|
||||
|
||||
static const char* const kMeshPath =
|
||||
"user/testdata/mesh.xml";
|
||||
static const char* const kDuplicateVerticesPath =
|
||||
"user/testdata/duplicate_vertices.xml";
|
||||
static const char* const kCubePath =
|
||||
@@ -100,6 +102,17 @@ TEST_F(MjCMeshTest, DeDuplicateSTLVertices) {
|
||||
mj_deleteModel(model);
|
||||
}
|
||||
|
||||
// ------------- test Mesh loading (MSH) ------------------------------
|
||||
TEST_F(MjCMeshTest, LoadMSH) {
|
||||
const std::string xml_path = GetTestDataFilePath(kMeshPath);
|
||||
char error[1024];
|
||||
size_t error_sz = 1024;
|
||||
mjModel* model = mj_loadXML(xml_path.c_str(), 0, error, error_sz);
|
||||
ASSERT_THAT(model, testing::NotNull()) << error;
|
||||
ASSERT_EQ(model->nmeshvert, 36);
|
||||
mj_deleteModel(model);
|
||||
}
|
||||
|
||||
// ------------- test OBJ loading ----------------------------------------------
|
||||
|
||||
using MjCMeshTest = MujocoTest;
|
||||
@@ -109,6 +122,7 @@ TEST_F(MjCMeshTest, LoadCube) {
|
||||
mjModel* model = mj_loadXML(xml_path.c_str(), 0, nullptr, 0);
|
||||
ASSERT_GT(model->ngeom, 0);
|
||||
ASSERT_EQ(model->nmeshvert, 8);
|
||||
ASSERT_EQ(model->nmeshface, 12);
|
||||
mj_deleteModel(model);
|
||||
}
|
||||
|
||||
@@ -146,7 +160,7 @@ TEST_F(MjCMeshTest, KeepDuplicateOBJVertices) {
|
||||
char error[1024];
|
||||
size_t error_sz = 1024;
|
||||
mjModel* model = mj_loadXML(xml_path.c_str(), 0, error, error_sz);
|
||||
ASSERT_EQ(model->nmeshvert, 12);
|
||||
ASSERT_EQ(model->nmeshvert, 16);
|
||||
mj_deleteModel(model);
|
||||
}
|
||||
|
||||
@@ -175,6 +189,26 @@ TEST_F(MjCMeshTest, TinyMeshLoads) {
|
||||
mj_deleteModel(model);
|
||||
}
|
||||
|
||||
// ------------- test inline loading ------------------------------------------
|
||||
TEST_F(MjCMeshTest, FaceNormalAutogenerated) {
|
||||
static constexpr char xml[] = R"(
|
||||
<mujoco>
|
||||
<asset>
|
||||
<mesh name="example_mesh"
|
||||
vertex="0 0 0 1 0 0 0 1 0 0 0 1"
|
||||
normal="1 0 0 0 1 0 0 0 1 0.707 0 0.707"
|
||||
face="0 2 1 0 3 2" />
|
||||
</asset>
|
||||
<worldbody>
|
||||
<geom type="mesh" mesh="example_mesh"/>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
)";
|
||||
mjModel* model = LoadModelFromString(xml, 0, 0);
|
||||
ASSERT_THAT(model, testing::NotNull());
|
||||
mj_deleteModel(model);
|
||||
}
|
||||
|
||||
// ------------- test inertia -------------------------------------------------
|
||||
|
||||
TEST_F(MjCMeshTest, SmallInertiaLoads) {
|
||||
|
||||
Reference in New Issue
Block a user