Beispiel #1
0
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);
}
Beispiel #2
0
    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)
                    }
                }
            }
        }
    }