Forum

User posts ice99
15 November 2017 22:59
Доброго! Реализую смену текстур. Постоянно грузить каждую текстуру на лету не хочется. Как подгрузить все текстуры вместе со сценой?
Ну, решение в лоб - делаете плоскость-палитру, на которой все ваши 100-500 текстур, и при загрузке делаете её невидимой. Она подтянет за собой текстуры. А обращаться к ним ,через API
https://www.blend4web.com/api_doc/module-textures.html#.replace_image
12 November 2017 18:57
Ответ на сообщение пользователя Дмитрий Пелевин
Функционала импорта нет. Но вы можете его написать для себя и никому не говорить :D
конечно, справлюсь за 5 минут. Однако мне думается, что такая возможность дала бы дополнительный толчок в развитии продукта. Подозреваю, что только разработчики B4W могут это осилить. Также подозреваю, что это не очень "лицензионно". Оптимальный вариант - разрабы делают, и подбрасывают его в коммьюнити от имени неизвестного хакера
12 November 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]
}


Может кто-нибудь прояснить, что происходит
03 November 2017 16:45
Ответ на сообщение пользователя Кирилл Осипов
Это нормальное решение, однако, есть несколько "но": не следует часто менять innerHTML (производительность), следует крайне ответственно относится к контенту помещаемому в innerHTML (безопасность, XSS), лучше использовать DOM элементы и соответствующее API, чем напрямую innerHTML..
Я не слишком силен в терминах, но я же вроде поиск по дереву DOM и использовал. Либо какой должен быть синтаксис?


Ответ на сообщение пользователя Кирилл Осипов
Так же id элемента анкера можно получить используя эту функцию.

get_element_id(obj)


Если не ошибаюсь, то он возвращает ID элемента в блендере, а не #id в html-коде. По крайней мере я его так использовал.
01 November 2017 15:54
Написал простенький скриптик общения с БД через php. Вызываю его через форму, всё как положено. БД в интернете. На хосте работает как надо, но при запуске локально
получаю ошибку
405: Method Not Allowed
Я так понимаю нет php сервера.
Есть ли быстрый выход из ситуации (подбросить php без танцев с бубном), или проще ставить openserver?
28 October 2017 23:24
Справился при помощи "Custom anchor" и конструкции
document.getElementById("my_anchor").innerHTML = "мой новый текст";


но не уверен, оптимальный ли это вариант
28 October 2017 22:02
Делаю сцену, в ней над объектом будет инфо-бокс с текстовой информацией. Думаю реализовать его через anchors.
Но дело в том, что это инфо-бокс должен меняться в процессе сцены, т.е. текст должен быть переменным.
Новую текстовую переменную я буду получать в коде приложения, но как вывести её на якорь? т.е. обновить его значение?
В api не нашел такой функции.
26 October 2017 17:10
Новичок. Что-то учу, что-то мучаю, что-то хочу подсмотреть.

На одном из сайтов нашел демку, которую хотел бы "поковырять".
Скачал скрипты, файлы (scene.json+scene.bin) .
Хотелось бы посмотреть на исходник scene.blend

Так вот возможно ли имея (scene.json+scene.bin) получить (понять) файл scene.blend?

т.е. не ЭКСПОРТ из blendera, а ИМПОРТ в блендер.

Есть варианты, или это противоречит лицензии и условиям пользования продуктом?
25 October 2017 20:26
итог такой: я бы закоментил pause и resume и посмотрел воспроизводится ли баг или нет
закоментил. баг остался
24 October 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. Может я что-то неправильно делаю.

Есть соображения?