Extend rangefinder sensor to support cameras.
PiperOrigin-RevId: 848255889 Change-Id: I6e1a9ed13d29d2242558625a47e24e47ad6e87db
This commit is contained in:
committed by
Copybara-Service
parent
4a871990e9
commit
9d646e6548
@@ -743,3 +743,43 @@ int mju_condataSize(int dataspec) {
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
// compute camera pixel parameters from model, output are:
|
||||
// pixel units: fx, fy (focal lengths), cx, cy (principal point)
|
||||
// length units: extent
|
||||
void mju_camIntrinsics(const mjModel* m, int camid,
|
||||
mjtNum* fx, mjtNum* fy, mjtNum* cx, mjtNum* cy, mjtNum* extent) {
|
||||
const int width = m->cam_resolution[2*camid];
|
||||
const int height = m->cam_resolution[2*camid+1];
|
||||
const float* sensorsize = m->cam_sensorsize + 2*camid;
|
||||
const float* intrinsic = m->cam_intrinsic + 4*camid;
|
||||
const mjtProjection projection = (mjtProjection)m->cam_projection[camid];
|
||||
|
||||
switch (projection) {
|
||||
case mjPROJ_PERSPECTIVE:
|
||||
if (sensorsize[0] && sensorsize[1]) {
|
||||
// intrinsic-based perspective camera
|
||||
*fx = intrinsic[0] / sensorsize[0] * width;
|
||||
*fy = intrinsic[1] / sensorsize[1] * height;
|
||||
*cx = intrinsic[2] / sensorsize[0] * width;
|
||||
*cy = intrinsic[3] / sensorsize[1] * height;
|
||||
} else {
|
||||
// fovy-based perspective camera
|
||||
*fx = *fy = 0.5 / mju_tan(m->cam_fovy[camid] * mjPI / 360.0) * height;
|
||||
*cx = (mjtNum)width / 2.0;
|
||||
*cy = (mjtNum)height / 2.0;
|
||||
}
|
||||
break;
|
||||
case mjPROJ_ORTHOGRAPHIC:
|
||||
// orthographic: normalize pixel offset to [-1, 1]
|
||||
*fx = (mjtNum)width / 2.0;
|
||||
*fy = (mjtNum)height / 2.0;
|
||||
*cx = *fx;
|
||||
*cy = *fy;
|
||||
break;
|
||||
}
|
||||
|
||||
// extent only used for orthographic cameras
|
||||
*extent = m->cam_fovy[camid];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user