Add target relative mouse motion actions.

PiperOrigin-RevId: 802072880
Change-Id: I1ff204594a126f8e50df4c703709f70ec4dd458c
This commit is contained in:
Haroon Qureshi
2025-09-02 03:38:45 -07:00
committed by Copybara-Service
parent ee777f74d3
commit 8d884585dd
5 changed files with 58 additions and 3 deletions
+3 -1
View File
@@ -2676,7 +2676,9 @@ typedef enum mjtMouse_ { // mouse interaction mode
mjMOUSE_ROTATE_H, // rotate, horizontal plane mjMOUSE_ROTATE_H, // rotate, horizontal plane
mjMOUSE_MOVE_V, // move, vertical plane mjMOUSE_MOVE_V, // move, vertical plane
mjMOUSE_MOVE_H, // move, horizontal plane mjMOUSE_MOVE_H, // move, horizontal plane
mjMOUSE_ZOOM // zoom mjMOUSE_ZOOM, // zoom
mjMOUSE_MOVE_V_REL, // move, vertical plane, relative to target
mjMOUSE_MOVE_H_REL, // move, horizontal plane, relative to target
} mjtMouse; } mjtMouse;
typedef enum mjtPertBit_ { // mouse perturbations typedef enum mjtPertBit_ { // mouse perturbations
mjPERT_TRANSLATE = 1, // translation mjPERT_TRANSLATE = 1, // translation
+3 -1
View File
@@ -44,7 +44,9 @@ typedef enum mjtMouse_ { // mouse interaction mode
mjMOUSE_ROTATE_H, // rotate, horizontal plane mjMOUSE_ROTATE_H, // rotate, horizontal plane
mjMOUSE_MOVE_V, // move, vertical plane mjMOUSE_MOVE_V, // move, vertical plane
mjMOUSE_MOVE_H, // move, horizontal plane mjMOUSE_MOVE_H, // move, horizontal plane
mjMOUSE_ZOOM // zoom mjMOUSE_ZOOM, // zoom
mjMOUSE_MOVE_V_REL, // move, vertical plane, relative to target
mjMOUSE_MOVE_H_REL, // move, horizontal plane, relative to target
} mjtMouse; } mjtMouse;
+2
View File
@@ -575,6 +575,8 @@ ENUMS: Mapping[str, EnumDecl] = dict([
('mjMOUSE_MOVE_V', 3), ('mjMOUSE_MOVE_V', 3),
('mjMOUSE_MOVE_H', 4), ('mjMOUSE_MOVE_H', 4),
('mjMOUSE_ZOOM', 5), ('mjMOUSE_ZOOM', 5),
('mjMOUSE_MOVE_V_REL', 6),
('mjMOUSE_MOVE_H_REL', 7),
]), ]),
)), )),
('mjtPertBit', ('mjtPertBit',
+48 -1
View File
@@ -294,12 +294,14 @@ static void convert2D(mjtNum* res, int action, mjtNum dx, mjtNum dy, const mjtNu
break; break;
case mjMOUSE_MOVE_V: case mjMOUSE_MOVE_V:
case mjMOUSE_MOVE_V_REL:
vec[0] = dx; vec[0] = dx;
vec[1] = 0; vec[1] = 0;
vec[2] = -dy; vec[2] = -dy;
break; break;
case mjMOUSE_MOVE_H: case mjMOUSE_MOVE_H:
case mjMOUSE_MOVE_H_REL:
vec[0] = dx; vec[0] = dx;
vec[1] = -dy; vec[1] = -dy;
vec[2] = 0; vec[2] = 0;
@@ -321,7 +323,7 @@ static void convert2D(mjtNum* res, int action, mjtNum dx, mjtNum dy, const mjtNu
// move camera with mouse; action is mjtMouse // move camera with mouse; action is mjtMouse
void mjv_moveCamera(const mjModel* m, int action, mjtNum reldx, mjtNum reldy, void mjv_moveCamera(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
const mjvScene* scn, mjvCamera* cam) { const mjvScene* scn, mjvCamera* cam) {
mjtNum headpos[3], forward[3]; mjtNum headpos[3], forward[3], up[3], right[3];
mjtNum vec[3], dif[3], scl; mjtNum vec[3], dif[3], scl;
// fixed camera: nothing to do // fixed camera: nothing to do
@@ -363,6 +365,25 @@ void mjv_moveCamera(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
cam->distance -= mju_log(1 + cam->distance/m->stat.extent/3) * reldy * 9 * m->stat.extent; cam->distance -= mju_log(1 + cam->distance/m->stat.extent/3) * reldy * 9 * m->stat.extent;
break; break;
case mjMOUSE_MOVE_V_REL:
case mjMOUSE_MOVE_H_REL:
// do not move lookat point of tracking camera
if (cam->type == mjCAMERA_TRACKING) {
return;
}
mjv_cameraInModel(headpos, forward, up, scn);
mju_cross(right, forward, up);
// y-axis movement moves forward/backward (ie. camera dolly) on horizontal plane or up/down
// (ie. camera pedestal) on vertical plane
mju_addToScl3(cam->lookat, (action == mjMOUSE_MOVE_V_REL) ? up : forward, reldy);
// x-axis movement strafes left/right (ie. camera truck)
mju_addToScl3(cam->lookat, right, reldx);
break;
default: default:
mjERROR("unexpected action %d", action); mjERROR("unexpected action %d", action);
} }
@@ -393,7 +414,12 @@ void mjv_moveCamera(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
// move perturb object with mouse; action is mjtMouse // move perturb object with mouse; action is mjtMouse
void mjv_movePerturb(const mjModel* m, const mjData* d, int action, mjtNum reldx, void mjv_movePerturb(const mjModel* m, const mjData* d, int action, mjtNum reldx,
mjtNum reldy, const mjvScene* scn, mjvPerturb* pert) { mjtNum reldy, const mjvScene* scn, mjvPerturb* pert) {
const mjtNum xaxis[3] = {1, 0, 0};
const mjtNum yaxis[3] = {0, 1, 0};
const mjtNum zaxis[3] = {0, 0, 1};
int sel = pert->select; int sel = pert->select;
const mjtNum* xmat = d->xmat+9*sel;
mjtNum forward[3], vec[3], scl, q1[4], xiquat[4]; mjtNum forward[3], vec[3], scl, q1[4], xiquat[4];
// get camera info and align // get camera info and align
@@ -404,10 +430,29 @@ void mjv_movePerturb(const mjModel* m, const mjData* d, int action, mjtNum reldx
switch ((mjtMouse) action) { switch ((mjtMouse) action) {
case mjMOUSE_MOVE_V: case mjMOUSE_MOVE_V:
case mjMOUSE_MOVE_H: case mjMOUSE_MOVE_H:
// move along world-space horizontal/vertical planes relative to camera
mju_addToScl3(pert->refpos, vec, pert->scale); mju_addToScl3(pert->refpos, vec, pert->scale);
mju_addToScl3(pert->refselpos, vec, pert->scale); mju_addToScl3(pert->refselpos, vec, pert->scale);
break; break;
case mjMOUSE_MOVE_V_REL:
case mjMOUSE_MOVE_H_REL:
// move along object's local coordinate frame
if (action == mjMOUSE_MOVE_H_REL) {
mju_mulMatVec3(vec, xmat, xaxis);
mju_addToScl3(pert->refpos, vec, pert->scale * reldy);
mju_addToScl3(pert->refselpos, vec, pert->scale * reldy);
} else {
mju_mulMatVec3(vec, xmat, zaxis);
mju_addToScl3(pert->refpos, vec, pert->scale * reldy);
mju_addToScl3(pert->refselpos, vec, pert->scale * reldy);
}
mju_mulMatVec3(vec, xmat, yaxis);
mju_addToScl3(pert->refpos, vec, pert->scale * reldx);
mju_addToScl3(pert->refselpos, vec, pert->scale * reldx);
break;
case mjMOUSE_ROTATE_V: case mjMOUSE_ROTATE_V:
case mjMOUSE_ROTATE_H: case mjMOUSE_ROTATE_H:
// normalize vector, get length // normalize vector, get length
@@ -506,12 +551,14 @@ void mjv_moveModel(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
break; break;
case mjMOUSE_MOVE_V: case mjMOUSE_MOVE_V:
case mjMOUSE_MOVE_V_REL:
for (int i=0; i < 3; i++) { for (int i=0; i < 3; i++) {
scn->translate[i] += (float)(roomright[i]*reldx - roomup[i]*reldy) * m->stat.extent; scn->translate[i] += (float)(roomright[i]*reldx - roomup[i]*reldy) * m->stat.extent;
} }
break; break;
case mjMOUSE_MOVE_H: case mjMOUSE_MOVE_H:
case mjMOUSE_MOVE_H_REL:
for (int i=0; i < 3; i++) { for (int i=0; i < 3; i++) {
scn->translate[i] += (float)(roomright[i]*reldx - roomforward[i]*reldy) * m->stat.extent; scn->translate[i] += (float)(roomright[i]*reldx - roomforward[i]*reldy) * m->stat.extent;
} }
+2
View File
@@ -582,6 +582,8 @@ public enum mjtMouse : int{
mjMOUSE_MOVE_V = 3, mjMOUSE_MOVE_V = 3,
mjMOUSE_MOVE_H = 4, mjMOUSE_MOVE_H = 4,
mjMOUSE_ZOOM = 5, mjMOUSE_ZOOM = 5,
mjMOUSE_MOVE_V_REL = 6,
mjMOUSE_MOVE_H_REL = 7,
} }
public enum mjtPertBit : int{ public enum mjtPertBit : int{
mjPERT_TRANSLATE = 1, mjPERT_TRANSLATE = 1,