You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
5.6 KiB
JavaScript
219 lines
5.6 KiB
JavaScript
import {
|
|
rotation_matrix_to_euler_angle,
|
|
euler_angle_to_rotate_matrix,
|
|
matmul,
|
|
transpose,
|
|
} from "./util.js";
|
|
//import {render_2d_image, update_image_box_projection} from "./image.js"
|
|
|
|
function Calib(data, editor) {
|
|
this.data = data;
|
|
this.editor = editor;
|
|
|
|
var euler_angle = { x: 0, y: 0, y: 0 };
|
|
var translate = { x: 0, y: 0, z: 0 };
|
|
|
|
this.save_calibration = function () {
|
|
var scene_meta = data.meta[data.world.frameInfo.scene];
|
|
|
|
var active_camera_name = data.world.cameras.active_name;
|
|
var calib = scene_meta.calib.camera[active_camera_name];
|
|
|
|
var extrinsic = calib.extrinsic.map(function (x) {
|
|
return x * 1.0;
|
|
});
|
|
|
|
euler_angle = rotation_matrix_to_euler_angle(extrinsic);
|
|
translate = {
|
|
x: extrinsic[3] * 1.0,
|
|
y: extrinsic[7] * 1.0,
|
|
z: extrinsic[11] * 1.0,
|
|
};
|
|
|
|
console.log(extrinsic, euler_angle, translate);
|
|
|
|
let matrix = euler_angle_to_rotate_matrix(euler_angle, translate);
|
|
console.log("restoreed matrix", matrix);
|
|
|
|
this.editor.infoBox.show("calib", JSON.stringify(matrix));
|
|
};
|
|
|
|
this.reset_calibration = function () {
|
|
// to be done
|
|
this.editor.imageContextManager.render_2d_image();
|
|
};
|
|
|
|
this.calib_box = null;
|
|
|
|
this.show_camera_pos = function () {
|
|
this.editor.viewManager.mainView.dumpPose();
|
|
};
|
|
|
|
// show a manipulating box
|
|
this.start_calibration = function () {
|
|
var scene_meta = this.data.meta[data.world.frameInfo.scene];
|
|
|
|
var active_camera_name = this.data.world.cameras.active_name;
|
|
var calib = scene_meta.calib.camera[active_camera_name];
|
|
var extrinsic = calib.extrinsic.map(function (x) {
|
|
return x * 1.0;
|
|
});
|
|
let viewMatrix = [
|
|
0,
|
|
-1,
|
|
0,
|
|
0, //row vector
|
|
0,
|
|
0,
|
|
-1,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
];
|
|
function transpose_transmatrix(m) {
|
|
//m=4*4
|
|
return [
|
|
m[0],
|
|
m[4],
|
|
m[8],
|
|
m[3],
|
|
m[1],
|
|
m[5],
|
|
m[9],
|
|
m[7],
|
|
m[2],
|
|
m[6],
|
|
m[10],
|
|
m[11],
|
|
m[12],
|
|
m[13],
|
|
m[14],
|
|
m[15],
|
|
];
|
|
}
|
|
|
|
var op_matrix = matmul(
|
|
transpose_transmatrix(viewMatrix),
|
|
transpose_transmatrix(extrinsic),
|
|
4
|
|
);
|
|
|
|
var euler_angle = rotation_matrix_to_euler_angle(op_matrix);
|
|
var translate = {
|
|
x: extrinsic[3] * 1.0,
|
|
y: extrinsic[7] * 1.0,
|
|
z: extrinsic[11] * 1.0,
|
|
};
|
|
|
|
console.log(euler_angle, translate);
|
|
this.show_camera_pos();
|
|
|
|
if (!this.calib_box) {
|
|
this.calib_box = this.data.world.annotation.createCuboid(
|
|
{
|
|
x: translate.x, // + this.data.world.coordinatesOffset[0],
|
|
y: translate.y, // + this.data.world.coordinatesOffset[1],
|
|
z: translate.z, // + this.data.world.coordinatesOffset[2]
|
|
},
|
|
{ x: 1, y: 1, z: 1 },
|
|
{
|
|
x: euler_angle.x,
|
|
y: euler_angle.y,
|
|
z: euler_angle.z,
|
|
},
|
|
"camera",
|
|
"camera"
|
|
);
|
|
|
|
this.data.world.scene.add(this.calib_box);
|
|
} else {
|
|
console.log("calib box exists.");
|
|
this.calib_box.position.x = translate.x; // + this.data.world.coordinatesOffset[0];
|
|
this.calib_box.position.y = translate.y; // + this.data.world.coordinatesOffset[1];
|
|
this.calib_box.position.z = translate.z; // + this.data.world.coordinatesOffset[2];
|
|
|
|
this.calib_box.rotation.x = euler_angle.x;
|
|
this.calib_box.rotation.y = euler_angle.y;
|
|
this.calib_box.rotation.z = euler_angle.z;
|
|
}
|
|
|
|
console.log(this.calib_box);
|
|
this.editor.render();
|
|
|
|
this.calib_box.on_box_changed = () => {
|
|
console.log("calib box changed.");
|
|
|
|
let real_pos = {
|
|
x: this.calib_box.position.x, // - this.data.world.coordinatesOffset[0],
|
|
y: this.calib_box.position.y, // - this.data.world.coordinatesOffset[1],
|
|
z: this.calib_box.position.z, // - this.data.world.coordinatesOffset[2],
|
|
};
|
|
|
|
let extrinsic = euler_angle_to_rotate_matrix(
|
|
this.calib_box.rotation,
|
|
real_pos
|
|
);
|
|
calib.extrinsic = transpose_transmatrix(matmul(viewMatrix, extrinsic, 4));
|
|
console.log("extrinsic", calib.extrinsic);
|
|
console.log("euler", euler_angle, "translate", translate);
|
|
|
|
this.editor.imageContextManager.render_2d_image();
|
|
};
|
|
};
|
|
|
|
function stop_calibration() {
|
|
//tbd
|
|
}
|
|
|
|
/*
|
|
function calibrate(ax, value){
|
|
var scene_meta = data.meta[data.world.frameInfo.scene];
|
|
|
|
var active_camera_name = data.world.cameras.active_name;
|
|
var calib = scene_meta.calib.camera[active_camera_name]
|
|
var extrinsic = calib.extrinsic.map(function(x){return x*1.0;});
|
|
|
|
var euler_angle = rotation_matrix_to_euler_angle(extrinsic);
|
|
var translate = {
|
|
x: extrinsic[3]*1.0,
|
|
y: extrinsic[7]*1.0,
|
|
z: extrinsic[11]*1.0,
|
|
};
|
|
|
|
if (ax == 'z'){
|
|
euler_angle.z += value;
|
|
}else if (ax == 'x'){
|
|
euler_angle.x += value;
|
|
}
|
|
else if (ax == 'y'){
|
|
euler_angle.y += value;
|
|
}else if (ax == 'tz'){
|
|
translate.z += value;
|
|
}else if (ax == 'tx'){
|
|
translate.x += value;
|
|
}
|
|
else if (ax == 'ty'){
|
|
translate.y += value;
|
|
}
|
|
|
|
calib.extrinsic = euler_angle_to_rotate_matrix(euler_angle, translate);
|
|
|
|
console.log("extrinsic", calib.extrinsic)
|
|
console.log("euler", euler_angle, "translate", translate);
|
|
|
|
render_2d_image();
|
|
|
|
if (selected_box)
|
|
update_image_box_projection(selected_box);
|
|
}
|
|
*/
|
|
}
|
|
|
|
export { Calib };
|