Add optional azimuth and elevation to initial free camera.
- Add `azimuth` and `elevation` to `visual.global`. - Add `mjv_defaultFreeCamera`. - Use `mjv_defaultFreeCamera` in `simulate`. PiperOrigin-RevId: 465505244 Change-Id: I61e60f14a990d4e2d220958adb75c325001978ee
This commit is contained in:
committed by
Copybara-Service
parent
5ee184ddaa
commit
b966a37855
@@ -152,6 +152,8 @@ void mj_defaultVisual(mjVisual* vis) {
|
||||
// global
|
||||
vis->global.fovy = 45;
|
||||
vis->global.ipd = 0.068;
|
||||
vis->global.azimuth = 90;
|
||||
vis->global.elevation = -45;
|
||||
vis->global.linewidth = 1.0;
|
||||
vis->global.glow = 0.3;
|
||||
vis->global.offwidth = 640;
|
||||
|
||||
@@ -241,6 +241,23 @@ void mjv_defaultCamera(mjvCamera* cam) {
|
||||
|
||||
|
||||
|
||||
// set default free camera
|
||||
void mjv_defaultFreeCamera(const mjModel* m, mjvCamera* cam) {
|
||||
memset(cam, 0, sizeof(mjvCamera));
|
||||
|
||||
cam->type = mjCAMERA_FREE;
|
||||
cam->fixedcamid = -1;
|
||||
cam->trackbodyid = -1;
|
||||
cam->lookat[0] = m->stat.center[0];
|
||||
cam->lookat[1] = m->stat.center[1];
|
||||
cam->lookat[2] = m->stat.center[2];
|
||||
cam->distance = 1.5 * m->stat.extent;
|
||||
cam->azimuth = m->vis.global.azimuth;
|
||||
cam->elevation = m->vis.global.elevation;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// set default perturbation
|
||||
void mjv_defaultPerturb(mjvPerturb* pert) {
|
||||
memset(pert, 0, sizeof(mjvPerturb));
|
||||
|
||||
@@ -43,6 +43,9 @@ MJAPI void mjv_freeScene(mjvScene* scn);
|
||||
// set default visualization options
|
||||
MJAPI void mjv_defaultOption(mjvOption* vopt);
|
||||
|
||||
// set default free camera
|
||||
MJAPI void mjv_defaultFreeCamera(const mjModel* m, mjvCamera* cam);
|
||||
|
||||
// set default camera
|
||||
MJAPI void mjv_defaultCamera(mjvCamera* cam);
|
||||
|
||||
|
||||
@@ -75,7 +75,8 @@ static const char* MJCF[nMJCF][mjXATTRNUM] = {
|
||||
|
||||
{"visual", "*", "0"},
|
||||
{"<"},
|
||||
{"global", "?", "6", "fovy", "ipd", "linewidth", "glow", "offwidth", "offheight"},
|
||||
{"global", "?", "8", "fovy", "ipd", "azimuth", "elevation", "linewidth", "glow", "offwidth",
|
||||
"offheight"},
|
||||
{"quality", "?", "5", "shadowsize", "offsamples", "numslices", "numstacks",
|
||||
"numquads"},
|
||||
{"headlight", "?", "4", "ambient", "diffuse", "specular", "active"},
|
||||
@@ -2034,6 +2035,8 @@ void mjXReader::Visual(XMLElement* section) {
|
||||
if (name=="global") {
|
||||
ReadAttr(elem, "fovy", 1, &vis->global.fovy, text);
|
||||
ReadAttr(elem, "ipd", 1, &vis->global.ipd, text);
|
||||
ReadAttr(elem, "azimuth", 1, &vis->global.azimuth, text);
|
||||
ReadAttr(elem, "elevation", 1, &vis->global.elevation, text);
|
||||
ReadAttr(elem, "linewidth", 1, &vis->global.linewidth, text);
|
||||
ReadAttr(elem, "glow", 1, &vis->global.glow, text);
|
||||
ReadAttrInt(elem, "offwidth", &vis->global.offwidth);
|
||||
|
||||
@@ -796,6 +796,8 @@ void mjXWriter::Visual(XMLElement* root) {
|
||||
elem = InsertEnd(section, "global");
|
||||
WriteAttr(elem, "fovy", 1, &vis->global.fovy, &visdef.global.fovy);
|
||||
WriteAttr(elem, "ipd", 1, &vis->global.ipd, &visdef.global.ipd);
|
||||
WriteAttr(elem, "azimuth", 1, &vis->global.azimuth, &visdef.global.azimuth);
|
||||
WriteAttr(elem, "elevation", 1, &vis->global.elevation, &visdef.global.elevation);
|
||||
WriteAttr(elem, "linewidth", 1, &vis->global.linewidth, &visdef.global.linewidth);
|
||||
WriteAttr(elem, "glow", 1, &vis->global.glow, &visdef.global.glow);
|
||||
WriteAttrInt(elem, "offwidth", vis->global.offwidth, visdef.global.offwidth);
|
||||
|
||||
Reference in New Issue
Block a user