getContext не работает

01 января 2017 16:21
Хочу понять, если есть элемент canvas и по нему я пытаюсь получить webgl context, чтобы выполнить проверку браузером наличия соответствующей поддержки и дальше работать с webvr согласно документации mozilla, как я могу это сделать, если для канваса b4w эта функция не числится вообще???
Алексей
01 января 2017 17:51
Покажите код.
02 января 2017 00:04
Не совсем понятно, о какой проверке идёт речь. Канвас можно получить этой функцией.
Проверить, поддерживает ли браузер WebVR можно, вызвав этот метод.
02 января 2017 18:17
Прикладываю код, который хотел бы повторить. Полный source лежит по адресу https://github.com/toji/webvr.info/blob/master/samples/03-vr-presentation.html и прекрасно включает передачу изображения в шлем.

Затык происходит на третьей строчке запроса наличия webgl контекста канваса. (см.фото)

      // WebGL setup.
      var webglCanvas = document.getElementById("webgl-canvas");
      var glAttribs = {
        alpha: false,
      };
      var gl = webglCanvas.getContext("webgl", glAttribs);
      if (!gl) {
        gl = webglCanvas.getContext("experimental-webgl", glAttribs);
        if (!gl) {
          VRSamplesUtil.addError("Your browser does not support WebGL.");
          return;
        }
      }
      gl.clearColor(0.1, 0.2, 0.3, 1.0);
      gl.enable(gl.DEPTH_TEST);
      gl.enable(gl.CULL_FACE);
      var textureLoader = new WGLUTextureLoader(gl);
      var texture = textureLoader.loadTexture("media/textures/cube-sea.png");
      var cubeSea = new VRCubeSea(gl, texture);
      var enablePerformanceMonitoring = WGLUUrl.getBool(
          'enablePerformanceMonitoring', false);
      var stats = new WGLUStats(gl, enablePerformanceMonitoring);
      var presentingMessage = document.getElementById("presenting-message");
      // ================================
      // WebVR-specific code begins here.
      // ================================
      function onVRRequestPresent () {
        // This can only be called in response to a user gesture.
        vrDisplay.requestPresent([{ source: webglCanvas }]).then(function () {
          // Nothing to do because we're handling things in onVRPresentChange.
        }, function (err) {
          var errMsg = "requestPresent failed.";
          if (err && err.message) {
            errMsg += "<br/>" + err.message
          }
          VRSamplesUtil.addError(errMsg, 2000);
        });
      }
      function onVRExitPresent () {
        // No sense in exiting presentation if we're not actually presenting.
        // (This may happen if we get an event like vrdisplaydeactivate when
        // we weren't presenting.)
        if (!vrDisplay.isPresenting)
          return;


Ссылка на доки
ссылка
Алексей
02 января 2017 19:39
Алексей, нужен ваш код. В какой момент вы вызываете getContext? Что пишет консоль? Как вы поняли, что нет такого метода?
02 января 2017 19:57
"main_canvas_container" в вашем случае - это контейнер для канваса, а не сам канвас, и у него действительно не определен метод getContext.

Проверить инициализировался webgl или нет, можно по второму параметру в коллбэке callback функции app.init:
exports.init = function() {
    m_app.init({
        ..
        callback: init_cb,
        ..
    });
}

function init_cb(canvas_elem, success) {
    if (!success) {
        console.log("b4w init failure");
        // Если мы попали сюда - это означает, что по какой-то причине контекст не инициализировался.
        return;
    }
    load();
}

Это аналог проверки, которая присутствует в коде, приведённом вами. Кстати, тут же есть доступ к канвасу. Здесь он назван canvas_elem. У него уже можно вызвать метод getContext.
02 января 2017 20:35
Хорошо, а дальше весь функционал работы с Webvr, который описан на том же самом MDN работать будет? Или через какой бэк-дор его тогда подключать?
Алексей
02 января 2017 20:56
Ответ на сообщение пользователя stilist
Хорошо, а дальше весь функционал работы с Webvr, который описан на том же самом MDN работать будет? Или через какой бэк-дор его тогда подключать?
Да, это обычный html-ный канвас, но в Blend4Web уже есть весь нужный функционал для VR. За него отвечает модуль hmd
Нужно проверить возможность включения VR c помощью функции check_browser_support,
и затем подключить hmd с помощью этой функции.

Вы можете посмотреть на пример использования в приложении, лежащем в этой директории: apps_dev/space_disaster. Работа с VR происходит в функции register_hmd.
02 января 2017 21:14
Я все проверял, подключал и переподключал. Space disaster отслеживает поворот шлема, но я вижу приложение в окне браузера, а не в шлеме. В шлеме я вижу обычную заставку. Возможно, что space disaster изначально рассчитан на линзы перед телефоном, поэтому ему достаточно просто разделить экран, а в приведенном мной примере имеется функционал переключения на внешний дисплей, коим является шлем и отключение картинки в браузере. Вот это требуется реализовать.
Алексей
03 января 2017 10:55
Добрый день.

Я все проверял, подключал и переподключал. Space disaster отслеживает поворот шлема, но я вижу приложение в окне браузера, а не в шлеме. В шлеме я вижу обычную заставку. Возможно, что space disaster изначально рассчитан на линзы перед телефоном, поэтому ему достаточно просто разделить экран, а в приведенном мной примере имеется функционал переключения на внешний дисплей, коим является шлем и отключение картинки в браузере. Вот это требуется реализовать.

Обратите внимание на следующие строки из приложения Space disaster
var container = m_cont.get_container();
    container.addEventListener("click", function(e) {
        // go to VR-mode in case of using HMD (WebVR API 1.0)
        m_input.request_fullscreen_hmd();
        // shoot
        is_clicked = true;
    })


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