Skip to content

Commit

Permalink
Meshcat can handle Mesh(foo.gltf)
Browse files Browse the repository at this point in the history
Meshcat passes embedded .gltf files along to the meshcat session. This
includes an incidental recentering of the objects created in the
meshcat_manual_test.cc.

This depends on updates to meshcat itself.
  • Loading branch information
SeanCurtis-TRI committed Jun 21, 2023
1 parent 403c538 commit 7398f50
Show file tree
Hide file tree
Showing 5 changed files with 225 additions and 10 deletions.
19 changes: 15 additions & 4 deletions geometry/meshcat.cc
Original file line number Diff line number Diff line change
Expand Up @@ -372,8 +372,8 @@ class MeshcatShapeReifier : public ShapeReifier {
std::istreambuf_iterator<char>());
meshfile_object.resources.try_emplace(
map, std::string("data:image/png;base64,") +
common_robotics_utilities::base64_helpers::Encode(
map_data));
common_robotics_utilities::base64_helpers::Encode(
map_data));
} else {
drake::log()->warn(
"Meshcat: Failed to load texture. \"{}\" references {}, but "
Expand All @@ -391,7 +391,18 @@ class MeshcatShapeReifier : public ShapeReifier {
matrix(0, 0) = mesh.scale();
matrix(1, 1) = mesh.scale();
matrix(2, 2) = mesh.scale();
} else { // not obj or no mtllib.
} else if (format == "gltf") {
auto& meshfile_object =
lumped.object.emplace<internal::MeshFileObjectData>();
meshfile_object.uuid = uuids::to_string((*uuid_generator_)());
meshfile_object.format = std::move(format);
meshfile_object.data = std::move(mesh_data);
Eigen::Map<Eigen::Matrix4d> matrix(meshfile_object.matrix);
matrix(0, 0) = mesh.scale();
matrix(1, 1) = mesh.scale();
matrix(2, 2) = mesh.scale();
} else {
// Neither obj with mtllib nor gltf. E.g., a Collada .dae file.
auto geometry = std::make_unique<internal::MeshFileGeometryData>();
geometry->uuid = uuids::to_string((*uuid_generator_)());
geometry->format = std::move(format);
Expand All @@ -404,7 +415,7 @@ class MeshcatShapeReifier : public ShapeReifier {
matrix(1, 1) = mesh.scale();
matrix(2, 2) = mesh.scale();
}
}
}

void ImplementGeometry(const Box& box, void* data) override {
DRAKE_DEMAND(data != nullptr);
Expand Down
3 changes: 3 additions & 0 deletions geometry/meshcat.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,9 @@ class Meshcat {
See @ref meshcat_path "Meshcat paths" for the semantics.
@param shape a Shape that specifies the geometry of the object.
@param rgba an Rgba that specifies the (solid) color of the object.
@note If `shape` is a mesh, the file referred to can be either an .obj file
or an _embedded_ .gltf file (it has all geometry data and texture data
contained within the single .gltf file).
@pydrake_mkdoc_identifier{shape}
*/
void SetObject(std::string_view path, const Shape& shape,
Expand Down
196 changes: 196 additions & 0 deletions geometry/render/test/meshes/cube.gltf
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v3.5.30",
"version":"2.0"
},
"extensionsUsed":[
"KHR_materials_specular",
"KHR_materials_ior"
],
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Cube"
}
],
"materials":[
{
"doubleSided":true,
"extensions":{
"KHR_materials_specular":{
"specularColorTexture":{
"index":0
},
"specularColorFactor":[
1.3258044921473595,
1.3258044921473595,
3.377744017936324
]
},
"KHR_materials_ior":{
"ior":1.4500000476837158
}
},
"name":"Material",
"normalTexture":{
"index":1
},
"pbrMetallicRoughness":{
"baseColorFactor":[
0.13678215503692627,
0.4000000715255737,
0.12162473320961,
1
],
"metallicRoughnessTexture":{
"index":2
}
}
}
],
"meshes":[
{
"name":"Cube.001",
"primitives":[
{
"attributes":{
"POSITION":0,
"TEXCOORD_0":1,
"NORMAL":2
},
"indices":3,
"material":0
}
]
}
],
"textures":[
{
"sampler":0,
"source":0
},
{
"sampler":0,
"source":1
},
{
"sampler":0,
"source":2
}
],
"images":[
{
"bufferView":4,
"mimeType":"image/png",
"name":"Image"
},
{
"bufferView":5,
"mimeType":"image/png",
"name":"normal"
},
{
"bufferView":6,
"mimeType":"image/png",
"name":"divot"
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":24,
"max":[
1,
1,
1
],
"min":[
-1,
-1,
-1
],
"type":"VEC3"
},
{
"bufferView":1,
"componentType":5126,
"count":24,
"type":"VEC2"
},
{
"bufferView":2,
"componentType":5126,
"count":24,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5123,
"count":36,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":288,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":192,
"byteOffset":288,
"target":34962
},
{
"buffer":0,
"byteLength":288,
"byteOffset":480,
"target":34962
},
{
"buffer":0,
"byteLength":72,
"byteOffset":768,
"target":34963
},
{
"buffer":0,
"byteLength":487,
"byteOffset":840
},
{
"buffer":0,
"byteLength":2114,
"byteOffset":1328
},
{
"buffer":0,
"byteLength":6253,
"byteOffset":3444
}
],
"samplers":[
{
"magFilter":9729,
"minFilter":9987
}
],
"buffers":[
{
"byteLength":9700,
"uri":"data:application/octet-stream;base64,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LmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgIHhtcE1NOkRvY3VtZW50SUQ9ImdpbXA6ZG9jaWQ6Z2ltcDo1N2Y0MTNmZi0zNTE0LTRkZTAtODM0Zi1hODNiMWEwYmM0MGEiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6YzI5YTQ4OGMtMzM2Zi00MzBjLWFkM2UtNzUzOTY2MDBmYmM3IgogICB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6Y2JmMWNiMjEtNGQ0Zi00YWU1LThiMWYtOTM4MWRhNjQ4ODg2IgogICBkYzpGb3JtYXQ9ImltYWdlL3BuZyIKICAgR0lNUDpBUEk9IjIuMCIKICAgR0lNUDpQbGF0Zm9ybT0iTGludXgiCiAgIEdJTVA6VGltZVN0YW1wPSIxNjg3MjQ1MjY5NjU0MjkxIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzAiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjQ0NGUwZWUtOWNlMy00MWI2LTg3M2UtYzlhYmFhMGE1N2RkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKExpbnV4KSIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMy0wNi0yMFQxNjoxNDoyOSswOTowMCIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz45fMquAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5wYUBw4db2TjIAAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAGjSURBVEjHY2SYlc1AS8DEQGMwasEIsICFoIrE37/SHt+XefZI4PULri+fGBgYvvHwfRCVeCIlN0tWaT4rK37tjPjzwZlbV9WvnOX5+hmr7Bdu3pu6xiaq2uQEUeeXz/dOHjQ+eQCX6QwMDDxfPxufOHD/5MGur19Is8D779+wK2cUb10hJpQVbl0JvXzG++9fEixov3FJ4fY14mNS4fbV9huXiLWg88tn9UunSU0t6pdOYw0oLBZ4PL7H9uc3qRaw/fnt/uguURZIPHtEXpLHqhGLBfxvXpJnAVaNWCxg//WTPAuwasRiwU82dvIswKoRiwUfRSXIs+CTqCRRFryQlCXPghdSskRZsENW6RcrG6mm/2Jl2y6rRJQF5Ty8t/TNSLXgloF5OTcPsUVFhZrOIw094k1/pKlfgaNMZWbwxeLY20xMkvxCMoyMAm9eEDZdy3CFpv40dg5y6oOzd66rXzvP/fE9Vtmv/EK3tA2NlDXIr9GMVTQT5ZUznj6SffmU79Vzzo/vGBgYvvMLfRKTfCwhM0NKdj6h5MA42rIbtYBiAAAURIzaAvjeuwAAAABJRU5ErkJgggAAAA=="
}
]
}
12 changes: 6 additions & 6 deletions geometry/test/meshcat_manual_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,12 @@ int do_main() {
meshcat->SetObject("cone", MeshcatCone(0.5, 0.25, 0.5), Rgba(1, 0, 0, 1));
meshcat->SetTransform("cone", RigidTransformd(Vector3d{++x, 0, 0}));

// The green color of this cube comes from the texture map.
// The color and shininess properties come from PBR materials.
meshcat->SetObject(
"obj", Mesh(FindResourceOrThrow(
"drake/geometry/render/test/meshes/box.obj"),
0.25));
meshcat->SetTransform("obj", RigidTransformd(Vector3d{++x, 0, 0}));
"gltf",
Mesh(FindResourceOrThrow("drake/geometry/render/test/meshes/cube.gltf"),
0.25));
meshcat->SetTransform("gltf", RigidTransformd(Vector3d{++x, 0, 0}));

auto mustard_obj =
FindRunfile("drake_models/ycb/meshes/006_mustard_bottle_textured.obj")
Expand Down Expand Up @@ -180,7 +180,7 @@ Open up your browser to the URL above.
- a blue box (long axis in z)
- a teal capsule (long axis in z)
- a red cone (expanding in +z, twice as wide in y than in x)
- a bright green cube (the green comes from a texture map)
- a shiny, green, dented cube (created with a PBR material)
- a yellow mustard bottle w/ label
- a dense rainbow point cloud in a box (long axis in z)
- a blue line coiling up (in z).
Expand Down
5 changes: 5 additions & 0 deletions geometry/test/meshcat_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,11 @@ GTEST_TEST(MeshcatTest, SetObjectWithShape) {
"drake/geometry/render/test/meshes/box.obj"),
0.25));
EXPECT_FALSE(meshcat.GetPackedObject("mesh").empty());
meshcat.SetObject(
"gltf", Mesh(FindResourceOrThrow(
"drake/geometry/render/test/meshes/cube.gltf"),
0.25));
EXPECT_FALSE(meshcat.GetPackedObject("gltf").empty());
meshcat.SetObject(
"convex", Convex(FindResourceOrThrow(
"drake/geometry/render/test/meshes/box.obj"),
Expand Down

0 comments on commit 7398f50

Please sign in to comment.