Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Meshcat can handle Mesh(foo.gltf) #19635

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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