getContext не работает
01 января 2017 16:21
Хочу понять, если есть элемент canvas и по нему я пытаюсь получить webgl context, чтобы выполнить проверку браузером наличия соответствующей поддержки и дальше работать с webvr согласно документации mozilla, как я могу это сделать, если для канваса b4w эта функция не числится вообще???
Алексей
02 января 2017 00:04
Не совсем понятно, о какой проверке идёт речь. Канвас можно получить этой функцией.
Проверить, поддерживает ли браузер WebVR можно, вызвав этот метод.
Проверить, поддерживает ли браузер WebVR можно, вызвав этот метод.
02 января 2017 18:17
Прикладываю код, который хотел бы повторить. Полный source лежит по адресу https://github.com/toji/webvr.info/blob/master/samples/03-vr-presentation.html и прекрасно включает передачу изображения в шлем.
Затык происходит на третьей строчке запроса наличия webgl контекста канваса. (см.фото)
Ссылка на доки
ссылка
Затык происходит на третьей строчке запроса наличия 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
02 января 2017 19:57
"main_canvas_container" в вашем случае - это контейнер для канваса, а не сам канвас, и у него действительно не определен метод getContext.
Проверить инициализировался webgl или нет, можно по второму параметру в коллбэке callback функции app.init:
Это аналог проверки, которая присутствует в коде, приведённом вами. Кстати, тут же есть доступ к канвасу. Здесь он назван canvas_elem. У него уже можно вызвать метод 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
02 января 2017 20:56
Ответ на сообщение пользователя stilistДа, это обычный html-ный канвас, но в Blend4Web уже есть весь нужный функционал для VR. За него отвечает модуль hmd
Хорошо, а дальше весь функционал работы с Webvr, который описан на том же самом MDN работать будет? Или через какой бэк-дор его тогда подключать?
Нужно проверить возможность включения 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 изначально рассчитан на линзы перед телефоном, поэтому ему достаточно просто разделить экран, а в приведенном мной примере имеется функционал переключения на внешний дисплей, коим является шлем и отключение картинки в браузере. Вот это требуется реализовать.
Обратите внимание на следующие строки из приложения 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;
})
Из-за требований безопасности нужно пользовательское действие (клик) для рендеринга на экране шлема