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 0c48fdc commit 89d7bfc
Show file tree
Hide file tree
Showing 5 changed files with 284 additions and 62 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.
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=="
}
]
}

0 comments on commit 89d7bfc

Please sign in to comment.