Форум

Странный функционал у rotate_camera

01 сентября 2017 11:03
Не получилось воспользоваться функцией rotate_camera. Поведение показалось странным,
поэтому попробовал заглянуть в исходный код, чтобы разобраться:

На сколько я понял, тут какая-то ошибка, поскольку, delta_phi и delta_theta получаются одинаковыми числами:
    var delta_phi   = 0;
    var delta_theta = 0;
   ..
    var cur_animator = m_time.animate(0, angle, time, function(e) {
    ...
        delta_phi   -= e;
        delta_theta -= e;


В результате камера может поворачиваться только вертикально, горизонтально или под углом 45 градусов:
        if (angle_theta && angle_phi)
            m_cam.rotate_camera(cam_obj, delta_phi, delta_theta); //delta_phi=delta_theta
        else if (angle_theta)
            m_cam.rotate_camera(cam_obj, 0, delta_theta);
        else if (angle_phi)
            m_cam.rotate_camera(cam_obj, delta_phi, 0);
05 сентября 2017 14:18
Спасибо, мы посмотрим
Руководитель проекта | VK | Twitter | Facebook | Linkedin
05 сентября 2017 16:03
Будет исправлено в следующем релизе.

Проблему можно решить заменой функции rotate_camera на следующую:
exports.rotate_camera = function(cam_obj, angle_phi, angle_theta, time, cb) {
    if (m_cam.get_move_style(cam_obj) == m_cam.MS_STATIC) {
        m_print.error("rotate_camera(): not supported for STATIC cameras");
        return;
    }

    if (_is_camera_rotating)
        return;

    if (!cam_obj) {
        m_print.error("rotate_camera(): you must specify the camera object");

        return;
    }

    if (!angle_phi && !angle_theta) {
        m_print.error("rotate_camera(): you must specify the rotation angle");

        return;
    }

    time = time || DEFAULT_CAM_ROTATE_TIME;

    _is_camera_rotating = true;

    function fin_cb() {
        if (_is_camera_rotating) {
            _is_camera_rotating == false;

            if (cb)
                cb();
        }
    }

    var delta_phi   = 0;
    var cur_animator_phi = m_time.animate(0, angle_phi, time, function(e) {
        m_cam.rotate_camera(cam_obj, delta_phi - e, 0);
        delta_phi = e;

        if (e >= angle_phi) {
            m_time.clear_animation(cur_animator_phi);
            fin_cb();
        }
    });

    var delta_theta = 0;
    var cur_animator_theta = m_time.animate(0, angle_theta, time, function(e) {
        m_cam.rotate_camera(cam_obj, 0, delta_theta - e);
        delta_theta = e;

        if (e >= angle_theta) {
            m_time.clear_animation(cur_animator_theta);
            fin_cb();
        }
    });
}
Команда Blend4Web
kirill@blend4web.com
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.