exports.disable_hmd = function() { m_ctl.remove_sensor_manifold(null, "HMD_ROTATE_CAMERA"); // set up non-vr mode var hmd_params = {}; hmd_params.enable_hmd_stereo = false; m_scenes.set_hmd_params(hmd_params); // resize screen to canvas resolution (non-vr mode) var canvas_container_elem = m_cont.get_container(); var ccw = canvas_container_elem.clientWidth; var cch = canvas_container_elem.clientHeight; m_cont.resize(ccw, cch, true); // correct up camera (non-vr mode) var cam_obj = m_scenes.get_active_camera(); m_cam.set_vertical_axis(cam_obj, m_util.AXIS_Y); // TODO: update_transform var cam_quat = m_trans.get_rotation(cam_obj, _quat_tmp); m_trans.set_rotation_v(cam_obj, cam_quat); }
var move_cam_cb = function(obj, id, pulse) { var cam_obj = m_scenes.get_active_camera(); if (!cam_obj) return; if (pulse > 0) { // NOTE: init part if (!updated_eye_data) { var hmd_left_fov = get_fov("left", _vec4_tmp); var hmd_right_fov = get_fov("right", _vec4_tmp2); if (hmd_left_fov && hmd_left_fov) m_cam.set_hmd_fov(cam_obj, hmd_left_fov, hmd_right_fov); var eye_distance = get_eye_distance(); if (eye_distance) m_cam.set_eye_distance(cam_obj, eye_distance); var hmd_params = {}; if (_hmd_device.deviceName.toLowerCase().indexOf("oculus") !== -1) var hmd_name = "oculus"; else var hmd_name = "default"; hmd_params.distortion_coefs = [ _devices_params[hmd_name]["distortion_coefs"][0], _devices_params[hmd_name]["distortion_coefs"][1] ]; hmd_params.chromatic_aberration_coefs = [ _devices_params[hmd_name]["chromatic_aberration_coefs"][0], _devices_params[hmd_name]["chromatic_aberration_coefs"][1], _devices_params[hmd_name]["chromatic_aberration_coefs"][2], _devices_params[hmd_name]["chromatic_aberration_coefs"][3] ]; hmd_params.distortion_scale = _devices_params[hmd_name]["distortion_scale"]; // TODO: set distortion_offset hmd_params.distortion_offset = 0.0; hmd_params.enable_hmd_stereo = true; m_scenes.set_hmd_params(hmd_params); var canvas_container_elem = m_cont.get_container(); var ccw = canvas_container_elem.clientWidth; var cch = canvas_container_elem.clientHeight; m_cont.resize(ccw, cch, true); updated_eye_data = true; _last_cam_quat = m_trans.get_rotation(cam_obj, _last_cam_quat); reset_hmd(); } // NOTE: It is executed every frame. // uses _vec3_tmp, _vec3_tmp2, _vec3_tmp3, _quat_tmp, _quat_tmp2 if (m_cam.is_eye_camera(cam_obj)) { if (control_type == HMD_ALL_AXES_MOUSE_NONE) { var hmd_quat = get_sensor_orientation(_quat_tmp); if (hmd_quat) { var quat = m_quat.setAxisAngle(m_util.AXIS_X, Math.PI / 2, _quat_tmp2); m_quat.normalize(quat, quat); hmd_quat = m_quat.multiply(hmd_quat, quat, _quat_tmp); var up_axis = m_vec3.transformQuat(m_util.AXIS_Z, hmd_quat, _vec3_tmp); m_cam.set_vertical_axis(cam_obj, up_axis); m_trans.set_rotation_v(cam_obj, hmd_quat); } } else if (control_type == HMD_ROLL_PITCH_MOUSE_YAW || control_type == HMD_ALL_AXES_MOUSE_YAW) { var hmd_quat = get_sensor_orientation(_quat_tmp); if (hmd_quat) { // NOTE: hmd_quat to WEBGL axis orientation var quat = m_quat.setAxisAngle(m_util.AXIS_X, Math.PI / 2, _quat_tmp2); m_quat.normalize(quat, quat); hmd_quat = m_quat.multiply(hmd_quat, quat, _quat_tmp); var cam_quat = m_trans.get_rotation(cam_obj, _quat_tmp2); var inv_cam_quat = m_quat.invert(cam_quat, _quat_tmp2); var diff_cam_quat = m_quat.multiply(_last_cam_quat, inv_cam_quat, _quat_tmp2); var cur_vertical_axis = m_cam.get_vertical_axis(cam_obj, _vec3_tmp); if (Math.abs(cur_vertical_axis[2]) < Math.PI / 4) var first_horiz_vec = m_vec3.cross(cur_vertical_axis, m_util.AXIS_Z, _vec3_tmp2); else if (Math.abs(cur_vertical_axis[1]) < Math.PI / 4) var first_horiz_vec = m_vec3.cross(cur_vertical_axis, m_util.AXIS_Y, _vec3_tmp2); m_vec3.normalize(first_horiz_vec, first_horiz_vec); var rotated_first_horiz_vec = m_vec3.transformQuat( first_horiz_vec, diff_cam_quat, _vec3_tmp3); var vertical_coef = m_vec3.dot(cur_vertical_axis, rotated_first_horiz_vec); var second_horiz_vec = m_vec3.scaleAndAdd(rotated_first_horiz_vec, cur_vertical_axis, -vertical_coef, _vec3_tmp3); m_vec3.normalize(second_horiz_vec, second_horiz_vec); var sign_horiz_vec = m_vec3.cross(cur_vertical_axis, first_horiz_vec, _vec3_tmp); var abs_yaw_angle = Math.acos(m_util.clamp( m_vec3.dot(first_horiz_vec, second_horiz_vec), 0, 1)); var sign_yaw_angle = m_util.sign(m_vec3.dot( second_horiz_vec, sign_horiz_vec)); var diff_yaw_cam_angle = abs_yaw_angle * sign_yaw_angle; _yaw_cam_angle += diff_yaw_cam_angle; var yaw_cam_quat = m_quat.setAxisAngle(m_util.AXIS_Y, -_yaw_cam_angle, _quat_tmp2); if (control_type == HMD_ALL_AXES_MOUSE_YAW) { var new_cam_quat = m_quat.multiply(yaw_cam_quat, hmd_quat, _quat_tmp); } else { var yaw_hmd_quat = m_util.quat_project(hmd_quat, m_util.AXIS_MY, m_util.AXIS_Y, m_util.AXIS_MZ, _quat_tmp3); var yaw_hmd_inv_quat = m_quat.invert(yaw_hmd_quat, _quat_tmp3); var vertical_hmd_quat = m_quat.multiply( yaw_hmd_inv_quat, hmd_quat, _quat_tmp3); var new_cam_quat = m_quat.multiply(yaw_cam_quat, vertical_hmd_quat, _quat_tmp); } var up_axis = m_vec3.transformQuat(m_util.AXIS_Z, new_cam_quat, _vec3_tmp); m_cam.set_vertical_axis(cam_obj, up_axis); m_trans.set_rotation_v(cam_obj, new_cam_quat); m_quat.copy(new_cam_quat, _last_cam_quat) } } } } }