Вопросы по API

23 октября 2014 14:13
Здравствуйте!
Первое, что хочу сказать - огромное спасибо за продукт!!! Это именно то, что я искал, и радости моей не было предела, когда наткнулся на статью о релизе.

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

Посему, если можно, буду просить здесь объяснить некоторые не понятные мне моменты. Уж простите, если буду спрашивать про совсем очевидные моменты.

Итак, первое, с чем возникли трудности - сенсоры. Если я все правильно понял, сенсор это слушатель некоего события. Параметр callback в методе controls.create_sensor_manifold() - обработчик этого события. Какова роль logic_function и какие параметры передаются в callback? И возможно ли в callback получить ссылку на объект сгенерировавший событие? Спасибо
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
23 октября 2014 16:51
Добрый день, и добро пожаловать на форум!

Концепцию сенсоров вы поняли совершенно верно.
В документации есть их описание и примеры применения. Насколько я понял, вы уже смотрели этот раздел, поэтому остановлюсь на ваших вопросах подробнее.

Какова роль logic_function?
Логическая функция, определяет, какие значения должны иметь сенсоры, чтобы вызвалась функция-обработчик. Например, есть логическая функция следующего вида:
function(s) {return s[0] && s[2]};
,где s - массив со значениями сенсоров в том порядке, в котором они задаются в массиве сенсоров. Если сенсоры под номерами 0 и 2 имеют положительное значение, то логическая функция так же будет положительной. Вызовется ли callback будет зависеть от типа выбранного manifold

какие параметры передаются в callback?
Callback имеет вид:
function(obj, manifold_id, pulse, param)

Здесь:
1) obj - объект, на котором "висит" manifold,
2) manifold_id - идентификатор манифолда, задаваемый при его создании.
3) pulse - параметр для манифолдов типа CT_CONTINUOS и CT_TRIGGER, определяющий, при каких обстоятельтвах был вызван callback. Чтобы понять, когда какие значения он принимает, я лучше приведу текст из исходников (logic_result - значение, которое вернула в данный момент логическая функция):
  switch (manifold.type) {
case exports.CT_CONTINUOUS:
if (logic_result) {
pulse = 1;
} else if (last_pulse == 1) {
pulse = -1;
} else
pulse = 0;
break;
case exports.CT_TRIGGER:
if (logic_result && last_pulse == -1) {
pulse = 1;
} else if (!logic_result && last_pulse == 1) {
pulse = -1;
} else
pulse = 0;
break;

4) param - это последний опциональный параметр, подаваемый в метод controls.create_sensor_manifold(). Это может быть любой нужный вам объект/значение/массив и т.п.

возможно ли в callback получить ссылку на объект сгенерировавший событие?
Вообще, далеко не все сенсоры вызываются каким-либо объектом. Поэтому такой возможности нет. Но в нашей модели первостепенную роль играет именно манифолд. Поэтому его и нужно создавать для того объекта с которым вы хотите провести какие-то манипуляции в обработчике.

Надеюсь, ответ получился не слишком запутанным
24 октября 2014 00:07
Ответ получился отличный!!! Спасибо.
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
26 октября 2014 00:26
Заметил, что нет документации по модулю quat
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
26 октября 2014 01:23
У меня еще один вопрос по сенсорам.
Динамически загружаю сцены, нахожу в загруженной сцене нужный мне меш и вешаю на него манифолд. Обработчик события вызывается, но вызывается не совсем так как мне нужно. Вот код


data.load('/models' + item.object.data.model + 'model_s.json', function(sceneId){
var obj = scene.get_object_by_name('object', sceneId);
var sensors = [];
var sensor = controls.create_mouse_move_sensor();

sensors.push(sensor);

controls.create_sensor_manifold(obj, 'OVER', controls.CT_SHOT, sensors, function(s){
return s[0];
}, function(object, id, pulse, params){
transform.set_translation(object, 1, 1, 1);
});
scene.show_object(obj);
}, null, null, true);


Суть в том, что callback вызывается при любом движении мышки, независимого от того провожу я мышкой над мешем или нет. Такая же ситуация и с controls.create_mouse_click_sensor(); Первое что приходит в голову - в логической функции проверять попадают ли текущие координаты указателя мышки в bounds меша, но мне кажется это немножко накладным (да и как-то с трудом представляю как их можно получить для трёх осей). Что я делаю не так? Может я в блендере галочку какую не поставил нужную?
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
26 октября 2014 15:53
Ответ на сообщение пользователя -Vampire-
Заметил, что нет документации по модулю quat
Да. Её действительно нет, потому что это часть открытой библиотеки gl-matrix. С её API можно ознакомиться на оффициальном сайте разработчика. Но, если возникают трудности, то, возможно, и правда стоит добавить её.

Ответ на сообщение пользователя -Vampire-
Суть в том, что callback вызывается при любом движении мышки, независимого от того провожу я мышкой над мешем или нет
controls.create_mouse_click_sensor() и controls.create_mouse_move_sensor() сами по себе "ничего не знают" об объектах на сцене. Чтобы реализовать описанное вами поведение, эти сенсоры следует использовать совместно с функцией из модуля scenes scenes.pick_object(x, y), которая пытается по задданым на экране координатам получить объект.
Так же нужно не забыть в Blender-е поставить на нужных объектах опцию Selectable
04 ноября 2014 19:24
У меня всё заработало. Спасибо
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
29 апреля 2015 19:14
А вот ещё вопрос по API: синтаксис передачи цвета в set_diffuse_color? Я так понимаю, что цвет передаётся в RGB, но непонятно в каком виде он в функцию вставляется.
Коплю деньги на коммерческий B4W.
29 апреля 2015 19:26
set_diffuse_color(obj, mat_name, color)
К примеру, я хочу изменить диффузный цвет объекта с чёрного на белый:set_diffuse_color("myObject", "myObjectMaterialName, …..?) rgb(1, 1, 1)?
Коплю деньги на коммерческий B4W.
30 апреля 2015 09:49
Добрый день.
Обратите внимание на этот пример.

Тут продемонстрирована работа модуля "material". Нажмите на кнопку "View code", чтобы посмотреть примеры использования функционала. Данное приложение также доступно из SDK (SDK/apps_dev/code_snippets/code_snippets_dev.html).

Кстати, разрядная сетка не от 0 до 1, а от 0 до 255:
m_mat.set_diffuse_color(cube_diffuse_color, "mat_diffuse_color", [50,0,0]);
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.