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}