Вопросы по API
23 октября 2014 14:13
Здравствуйте!
Первое, что хочу сказать - огромное спасибо за продукт!!! Это именно то, что я искал, и радости моей не было предела, когда наткнулся на статью о релизе.
Но начав использовать, столкнулся с проблемой. Документация для разработчиков оказалась для меня довольно скудной и не совсем понятной. Не исключаю, что это из-за того, что в 3D я совсем начинающий.
Посему, если можно, буду просить здесь объяснить некоторые не понятные мне моменты. Уж простите, если буду спрашивать про совсем очевидные моменты.
Итак, первое, с чем возникли трудности - сенсоры. Если я все правильно понял, сенсор это слушатель некоего события. Параметр callback в методе controls.create_sensor_manifold() - обработчик этого события. Какова роль logic_function и какие параметры передаются в callback? И возможно ли в callback получить ссылку на объект сгенерировавший событие? Спасибо
Первое, что хочу сказать - огромное спасибо за продукт!!! Это именно то, что я искал, и радости моей не было предела, когда наткнулся на статью о релизе.
Но начав использовать, столкнулся с проблемой. Документация для разработчиков оказалась для меня довольно скудной и не совсем понятной. Не исключаю, что это из-за того, что в 3D я совсем начинающий.
Посему, если можно, буду просить здесь объяснить некоторые не понятные мне моменты. Уж простите, если буду спрашивать про совсем очевидные моменты.
Итак, первое, с чем возникли трудности - сенсоры. Если я все правильно понял, сенсор это слушатель некоего события. Параметр callback в методе controls.create_sensor_manifold() - обработчик этого события. Какова роль logic_function и какие параметры передаются в callback? И возможно ли в callback получить ссылку на объект сгенерировавший событие? Спасибо
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
23 октября 2014 16:51
Добрый день, и добро пожаловать на форум!
Концепцию сенсоров вы поняли совершенно верно.
В документации есть их описание и примеры применения. Насколько я понял, вы уже смотрели этот раздел, поэтому остановлюсь на ваших вопросах подробнее.
Здесь:
1) obj - объект, на котором "висит" manifold,
2) manifold_id - идентификатор манифолда, задаваемый при его создании.
3) pulse - параметр для манифолдов типа CT_CONTINUOS и CT_TRIGGER, определяющий, при каких обстоятельтвах был вызван callback. Чтобы понять, когда какие значения он принимает, я лучше приведу текст из исходников (logic_result - значение, которое вернула в данный момент логическая функция):
4) param - это последний опциональный параметр, подаваемый в метод controls.create_sensor_manifold(). Это может быть любой нужный вам объект/значение/массив и т.п.
Надеюсь, ответ получился не слишком запутанным
Концепцию сенсоров вы поняли совершенно верно.
В документации есть их описание и примеры применения. Насколько я понял, вы уже смотрели этот раздел, поэтому остановлюсь на ваших вопросах подробнее.
Какова роль 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
26 октября 2014 01:23
У меня еще один вопрос по сенсорам.
Динамически загружаю сцены, нахожу в загруженной сцене нужный мне меш и вешаю на него манифолд. Обработчик события вызывается, но вызывается не совсем так как мне нужно. Вот код
Суть в том, что callback вызывается при любом движении мышки, независимого от того провожу я мышкой над мешем или нет. Такая же ситуация и с controls.create_mouse_click_sensor(); Первое что приходит в голову - в логической функции проверять попадают ли текущие координаты указателя мышки в bounds меша, но мне кажется это немножко накладным (да и как-то с трудом представляю как их можно получить для трёх осей). Что я делаю не так? Может я в блендере галочку какую не поставил нужную?
Динамически загружаю сцены, нахожу в загруженной сцене нужный мне меш и вешаю на него манифолд. Обработчик события вызывается, но вызывается не совсем так как мне нужно. Вот код
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-Да. Её действительно нет, потому что это часть открытой библиотеки gl-matrix. С её API можно ознакомиться на оффициальном сайте разработчика. Но, если возникают трудности, то, возможно, и правда стоит добавить её.
Заметил, что нет документации по модулю quat
Ответ на сообщение пользователя -Vampire-controls.create_mouse_click_sensor() и controls.create_mouse_move_sensor() сами по себе "ничего не знают" об объектах на сцене. Чтобы реализовать описанное вами поведение, эти сенсоры следует использовать совместно с функцией из модуля scenes scenes.pick_object(x, y), которая пытается по задданым на экране координатам получить объект.
Суть в том, что callback вызывается при любом движении мышки, независимого от того провожу я мышкой над мешем или нет
Так же нужно не забыть в Blender-е поставить на нужных объектах опцию Selectable
04 ноября 2014 19:24
29 апреля 2015 19:14
29 апреля 2015 19:26
30 апреля 2015 09:49
Добрый день.
Обратите внимание на этот пример.
Тут продемонстрирована работа модуля "material". Нажмите на кнопку "View code", чтобы посмотреть примеры использования функционала. Данное приложение также доступно из SDK (SDK/apps_dev/code_snippets/code_snippets_dev.html).
Кстати, разрядная сетка не от 0 до 1, а от 0 до 255:
Обратите внимание на этот пример.
Тут продемонстрирована работа модуля "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]);