2828#include "engine/engine_util_errmem.h"
2929#include "engine/engine_util_misc.h"
3030#include "engine/engine_util_spatial.h"
31+ #include "engine/engine_vis_visualize.h"
3132
3233// transform pose from room to model space
3334void mjv_room2model (mjtNum * modelpos , mjtNum * modelquat , const mjtNum * roompos ,
@@ -247,6 +248,20 @@ mjtNum mjv_frustumHeight(const mjvScene* scn) {
247248}
248249
249250
251+ static mjtNum cameraFrustumHeight (const mjModel * m , const mjvCamera * cam ) {
252+ float zclip [2 ] = {0 , 0 }, zver [2 ] = {0 , 0 };
253+ mjv_cameraFrustum (zver , NULL , zclip , m , cam );
254+ if (cam -> orthographic ) {
255+ return (zver [1 ] + zver [0 ]);
256+ } else {
257+ if (zclip [0 ] < mjMINVAL ) {
258+ mjERROR ("mjvScene frustum_near too small" );
259+ }
260+ return (zver [1 ] + zver [0 ]) / zclip [0 ];
261+ }
262+ }
263+
264+
250265// rotate 3D vec in horizontal plane by angle between (0,1) and (forward_x,forward_y)
251266void mjv_alignToCamera (mjtNum * res , const mjtNum * vec , const mjtNum * forward ) {
252267 mjtNum xaxis [2 ], yaxis [2 ];
@@ -311,12 +326,12 @@ static void convert2D(mjtNum* res, int action, mjtNum dx, mjtNum dy, const mjtNu
311326
312327
313328// move camera with mouse; action is mjtMouse
314- void mjv_moveCamera (const mjModel * m , int action , mjtNum reldx , mjtNum reldy ,
315- const mjvScene * scn , mjvCamera * cam ) {
329+ void mjv_moveCamera (const mjModel * m , int action , mjtNum reldx , mjtNum reldy , mjvCamera * cam ) {
316330 mjtNum headpos [3 ], forward [3 ], up [3 ], right [3 ];
317331 mjtNum vec [3 ], dif [3 ], scl ;
318332
319333 // fixed camera: nothing to do
334+ // note: mjv_cameraFrame, which we use below, requires mjData for non-fixed camera
320335 if (cam -> type == mjCAMERA_FIXED ) {
321336 return ;
322337 }
@@ -337,12 +352,12 @@ void mjv_moveCamera(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
337352 }
338353
339354 // get camera info and align
340- mjv_cameraInModel (headpos , forward , NULL , scn );
355+ mjv_cameraFrame (headpos , forward , NULL , NULL , NULL , cam );
341356 convert2D (vec , action , reldx , reldy , forward );
342357
343358 // compute scaling: rendered lookat displacement = mouse displacement
344359 mju_sub3 (dif , cam -> lookat , headpos );
345- scl = mjv_frustumHeight ( scn ) * mju_dot3 (dif , forward );
360+ scl = cameraFrustumHeight ( m , cam ) * mju_dot3 (dif , forward );
346361
347362 // multiply by mystery coefficient TODO: b/346130949
348363 if (cam -> orthographic ) scl *= 0.15 ;
@@ -362,7 +377,7 @@ void mjv_moveCamera(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
362377 return ;
363378 }
364379
365- mjv_cameraInModel (headpos , forward , up , scn );
380+ mjv_cameraFrame (headpos , forward , up , NULL , NULL , cam );
366381 mju_cross (right , forward , up );
367382
368383 // y-axis movement moves forward/backward (ie. camera dolly) on horizontal plane or up/down
0 commit comments