Как вызвать функцию после обновления кадра?

28 сентября 2017 12:04
Есть следующий код (упрощенно):
    var cam_obj = m_scenes.get_active_camera();
    m_cam.rotate_camera(cam_obj, 0, 0, true);
    var dataURL = $('#main_canvas_container canvas')[0].toDataURL();  //получаем содержимое canvas.

Проблема в том, что canvas не успевает обновиться после поворота. Как сделать колбек на обновление кадра? Т.е. запустить .toDataURL(); уже после того, как новый кадр прорисован?
29 сентября 2017 19:08
Можно воспользоваться методами set_render_callback/clear_render_callback, чтобы выставить колбек на ближайший кадр, а потом после отработки сразу удалить его:
var cam_obj = m_scenes.get_active_camera();
m_cam.rotate_camera(cam_obj, 0, 0, true);

m_main.set_render_callback(function() {
    var dataURL = $('#main_canvas_container canvas')[0].toDataURL();
    m_main.clear_render_callback();
});

- но он выполняется прямо перед отрисовкой, поэтому изменения, скорее всего, ещё не будут видны, только если делать его не на следующий, а через один кадр.

Также можно использовать метод canvas_data_url, который снимет ближайший кадр и вернет его, правда в виде урла Blob-объекта, а не dataURL. Пример использования есть во внешнем модуле screen.js в функции взятия скриншота: https://github.com/TriumphLLC/Blend4Web/blob/17.08/src/ext/screen.js#L434-L450
09 октября 2017 10:56
Спасибо, все получилось:

  m_m.set_render_callback(function() {
                    m_m.clear_render_callback();
                    m_m.set_render_callback(function() {
                        m_m.clear_render_callback();
                        image= $('#main_canvas_container canvas')[0].toDataURL();
                        shoot.resolve();
                    });
                });
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.