diff --git a/src/experimental/studio/app.cc b/src/experimental/studio/app.cc index cd702338..2388405b 100644 --- a/src/experimental/studio/app.cc +++ b/src/experimental/studio/app.cc @@ -1701,7 +1701,7 @@ void App::RenderingGui() { SetCamera(ui_.camera_idx); } if (ImGui::Button("Copy Camera")) { - std::string camera_string = toolbox::CameraToString(&scene); + std::string camera_string = toolbox::CameraToString(Data(), &camera_); toolbox::MaybeSaveToClipboard(camera_string); } diff --git a/src/experimental/toolbox/helpers.cc b/src/experimental/toolbox/helpers.cc index ab73fe62..ad4f656f 100644 --- a/src/experimental/toolbox/helpers.cc +++ b/src/experimental/toolbox/helpers.cc @@ -29,6 +29,7 @@ #include #include #include +#include "engine/engine_vis_visualize.h" #include "xml/xml_api.h" namespace mujoco::toolbox { @@ -137,25 +138,15 @@ const void* GetValue(const mjModel* model, const mjData* data, return nullptr; // Invalid field. } -std::string CameraToString(const mjvScene* scene) { - const mjvGLCamera* cameras = scene->camera; - const float pos_x = (cameras[0].pos[0] + cameras[1].pos[0]) / 2; - const float pos_y = (cameras[0].pos[1] + cameras[1].pos[1]) / 2; - const float pos_z = (cameras[0].pos[2] + cameras[1].pos[2]) / 2; - - mjtNum cam_forward[3]; - mju_f2n(cam_forward, cameras[0].forward, 3); - mjtNum cam_up[3]; - mju_f2n(cam_up, cameras[0].up, 3); - mjtNum cam_right[3]; - mju_cross(cam_right, cam_forward, cam_up); - +std::string CameraToString(const mjData* data, const mjvCamera* camera) { + mjtNum pos[3], forward[3], up[3], right[3]; + mjv_cameraFrame(pos, forward, up, right, data, camera); char str[500]; std::snprintf(str, sizeof(str), "\n", - pos_x, pos_y, pos_z, cam_right[0], cam_right[1], cam_right[2], - cam_up[0], cam_up[1], cam_up[2]); + pos[0], pos[1], pos[2], right[0], right[1], right[2], + up[0], up[1], up[2]); return str; } diff --git a/src/experimental/toolbox/helpers.h b/src/experimental/toolbox/helpers.h index b2382c20..ee72f3d0 100644 --- a/src/experimental/toolbox/helpers.h +++ b/src/experimental/toolbox/helpers.h @@ -54,8 +54,8 @@ mjModel* LoadMujocoModel(const std::string& model_file, const mjVFS* vfs); const void* GetValue(const mjModel* model, const mjData* data, const char* field, int index); -// Returns an XML string representation of the scene cameras. -std::string CameraToString(const mjvScene* scene); +// Returns an XML string representation of the camera. +std::string CameraToString(const mjData* data, const mjvCamera* camera); // Returns an XML string representation of current data keyframe. std::string KeyframeToString(const mjModel* model, const mjData* data,