Форум

Захватывается мышь после возвращения контроля.

24 октября 2017 14:46
Есть сцена. Неважно какая, обычный дефолтный куб. Управление - дефолтное вращение.
Вращение осуществляется когда зажата левая клавиша мыши.
При клике на куб (в 3D пространстве) у меня открывается html-меню на этой же 3D канве.
При закрытии меню происходит возврат в управление 3D сценой.
Логика такая

при передаче управления в меню я делаю
                         m_app.disable_camera_controls();
			 m_main.pause();


при передаче управления 3D сцене ()
			  m_app.enable_camera_controls();
			 m_main.resume();


Так вот при возврате в управление 3D сцены у меня происходит странная вещь:
Сцена вращается БЕЗ зажатой левой клавиши мыши.
Такое ощущение, что включается pointerlock() (но без сокрытия курсора) на вращение объекта
Кликаю мышкой на канве - управление приходит в норму.

Варианта 2:
1. Эмулировать в конце процедуры возврата клик на канве. (не получается пока)
2. Как-то разобраться с функциями B4W. Может я что-то неправильно делаю.

Есть соображения?
25 октября 2017 19:46
дык там работает следующая схема:
при клике на мышку начинается трекинг мышки сенсором
при отпускании мышки заканчивается трекинг мышки сенсором

если поставить на паузу, то сенсорная система не реагирует на события, то есть если по клику поставить паузу, то трекинг будет идти и не будет завершаться.

сама мышка отслеживается браузерным обработчиком события, поэтому она не зависит от сенсоров.

итог такой: я бы закоментил pause и resume и посмотрел воспроизводится ли баг или нет
25 октября 2017 20:26
итог такой: я бы закоментил pause и resume и посмотрел воспроизводится ли баг или нет
закоментил. баг остался
12 ноября 2017 18:30
Разобрался. В принципе, логично, но сразу не догнал.
Стандартную строчку
m_app.enable_camera_controls();

Нужно переместить в пользовательском коде ПОСЛЕ вызова функций включающих включение/выключение взаимодействия с ней. Грубо говоря - в конец кода.

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

т.е. вот так глюк есть (но только при первом цикле)
   function main_canvas_click(e) {
var x = e.clientX;
var y = e.clientY;

var obj = m_scenes.pick_object(x, y);

if (obj) { //кликая на куб - показываем div, и отключаем управление камерой
var elem = document.getElementById("my_div");
elem.style.visibility = "visible";
m_app.disable_camera_controls();
m_main.pause();
}
}

function hide_div() { //кликая на div, убираем его и передаём управление мышке
var elem = document.getElementById("my_div");
elem.style.visibility = "hidden";
m_app.enable_camera_controls();
m_main.resume();
}



function load_cb(data_id, success) {

if (!success) {
console.log("b4w load failure");
return;
}
[b] m_app.enable_camera_controls();[/b]
// place your code here
main_canvas_container.addEventListener("mousedown", main_canvas_click, false); //Здесь по клику на куб - отключаю камеру
my_div.addEventListener("mouseup", hide_div, false); //здесь, по клику на div - включаю камеру
}


а вот так глюка нет
    function main_canvas_click(e) {
var x = e.clientX;
var y = e.clientY;

var obj = m_scenes.pick_object(x, y);

if (obj) { //кликая на куб - показываем div? и отключаем управление камерой
var elem = document.getElementById("my_div");
elem.style.visibility = "visible";
m_app.disable_camera_controls();
m_main.pause();
}
}

function hide_div() { //кликая на div, убираем его и передаём управление мышке
var elem = document.getElementById("my_div");
elem.style.visibility = "hidden";
m_app.enable_camera_controls();
m_main.resume();
}


function load_cb(data_id, success) {

if (!success) {
console.log("b4w load failure");
return;
}

// place your code here
main_canvas_container.addEventListener("mousedown", main_canvas_click, false); //Здесь по клику на куб - отключаю камеру
my_div.addEventListener("mouseup", hide_div, false); //здесь, по клику на div - включаю камеру
[b] m_app.enable_camera_controls();[/b]
}


Может кто-нибудь прояснить, что происходит
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.