Нужна помощь
15 ноября 2016 17:04
Я понял, спасибо.
Голову сломал уже над тем, как корректно сразу развернуть персонаж под камеру, с которой отключается анимация.
Есть такая функция:
В ней m_phy.set_transform корректно переносит персонажа, но потом, если я немного не поверну камерой и персонаж не синхронизируется с камерой через:
то он то бочком идет, то задом. Я применял разные способы: взять кватернион с кадра анимации, перевести из эйлеровских координат get_camera_angles и angles_char - у персонажа меняется угол куда он пятится, но идеально чтобы точно по курсу он не идет. Не могу понять, почему m_phy.set_character_rotation не поворачивает персонажа, а кватернион с анимации не выставляет его ровно по курсу поворота камеры. Дайте наводку, почему это так?
Голову сломал уже над тем, как корректно сразу развернуть персонаж под камеру, с которой отключается анимация.
Есть такая функция:
case -1:
console.log(s_vars.vp_state);
m_anim.stop(s_vars.camobj);
upd_pos(s_vars.camobj);
m_phy.set_transform(s_vars.character, _pos_tmp.sp_trn.slice(0,3), _pos_tmp.sp_rot);
m_cons.append_stiff_trans(s_vars.camobj, s_vars.character, [0, 0, 0.5]);
break;
}
В ней m_phy.set_transform корректно переносит персонажа, но потом, если я немного не поверну камерой и персонаж не синхронизируется с камерой через:
m_phy.set_character_rotation(s_vars.character, m_cam.get_camera_angles_char(s_vars.camobj, _vec2_tmp)[0], 0);
то он то бочком идет, то задом. Я применял разные способы: взять кватернион с кадра анимации, перевести из эйлеровских координат get_camera_angles и angles_char - у персонажа меняется угол куда он пятится, но идеально чтобы точно по курсу он не идет. Не могу понять, почему m_phy.set_character_rotation не поворачивает персонажа, а кватернион с анимации не выставляет его ровно по курсу поворота камеры. Дайте наводку, почему это так?
Алексей
15 ноября 2016 17:27
15 ноября 2016 18:41
В общем, "портит все" set_transform(obj, trans, quat) и в ней кватернион. Если не переносить этот объект, не привязывать к камере, а наблюдать со стороны как он ведет себя - он сразу обновляет свое направление с учетом углов камеры, если только отключить set_transform. Уточните, какой кватернион задавать персонажу при переносе или может есть какой-нибудь "нулевой" кватернион, чтобы сначала развернуть персонажа, а потом просто перенести, без изменения направления?
Алексей
16 ноября 2016 00:25
Помогайте, друзья,
Я измучил уже персонажа пытаясь без ручного поворота камеры дать ему сразу нужный поворот.
Согласно консоли кватернионы корректно собираются.
Более того, он и ходит точно по осям как будто у него значение {1,0,0,0].
Я понимаю, что можно привязать камеру, быстро нажать право-лево и выровнять его, но тут вопрос принципа - почему такое поведение персонажа и что надо сделать, чтобы корректно передавать ему координаты вектора?
Я измучил уже персонажа пытаясь без ручного поворота камеры дать ему сразу нужный поворот.
Согласно консоли кватернионы корректно собираются.
[5.253169536590576, 0.20752131938934326, 0.005760488100349903]
Эйлеровские с камеры
flywalk.js:74 [0.3103335201740265, 0.5483389496803284, 0.6758158802986145, 0.38247933983802795]
get_rotation с камеры
flywalk.js:75 [0.29815277457237244, 0.5550100207328796, 0.6658003926277161, 0.3997231721878052]
С анимации по целочисленному номеру кадра
flywalk.js:76 [0.3103335201740265, 0.5483389496803284, 0.6758158802986145, 0.38247933983802795]
Пересчет эйлер_ту_кват с камеры
flywalk.js:77 [0.4901502728462219, -0.08872837573289871, -0.05350780859589577, -0.8654576539993286]
А это то, что приобретает персонаж когда ему передаешь кватернионы из вышеперечисленного
Более того, он и ходит точно по осям как будто у него значение {1,0,0,0].
Я понимаю, что можно привязать камеру, быстро нажать право-лево и выровнять его, но тут вопрос принципа - почему такое поведение персонажа и что надо сделать, чтобы корректно передавать ему координаты вектора?
Алексей
16 ноября 2016 03:54
Какая-то прямо скажем ООЧЕНЬ большая разница между работой dev версии и build. В build часть функций вообще перестала работать, в частности все что касается object.anim_slots[N].текущие_параметры_анимации - кадры, векторы и т.д - в консоли писала, что такого объекта просто не существует.
Не работает перечень объектов по этой функции в отдельном модуле.
А в консоли по билд версии такая надпись начала красоваться:
objs = b4w.scenes.get_all_objects()
VM41769:1 Uncaught TypeError: Cannot read property 'get_all_objects' of undefined(…)
Перечень объектов должен экспортироваться и участвовать в замене текстур, а по факту массив пустой, никаких ошибок в консоли даже не пишет.
Как можно получить список объектов в виде массива и чего делать с этими ограничениями билд версии?
Не работает перечень объектов по этой функции в отдельном модуле.
var objs = [];
var excl_objs = ['Character'];
m_scs.get_all_objects().forEach(function(i){
if (i.type == 'MESH' && i.bpy_origin && !excl_objs.includes(i.name)) {
console.log(i.name);
objs[objs.length] = i
};
});
exports.objs = objs;
А в консоли по билд версии такая надпись начала красоваться:
objs = b4w.scenes.get_all_objects()
VM41769:1 Uncaught TypeError: Cannot read property 'get_all_objects' of undefined(…)
Перечень объектов должен экспортироваться и участвовать в замене текстур, а по факту массив пустой, никаких ошибок в консоли даже не пишет.
Как можно получить список объектов в виде массива и чего делать с этими ограничениями билд версии?
Алексей
16 ноября 2016 12:26
Я понимаю, что можно привязать камеру, быстро нажать право-лево и выровнять его, но тут вопрос принципа - почему такое поведение персонажа и что надо сделать, чтобы корректно передавать ему координаты вектора?А метод m_phy.set_character_rotation работает? С ним, вроде, не должно быть проблем. Вообще, можете прислать проект? Без кода сейчас непонятно, что происходит.
Какая-то прямо скажем ООЧЕНЬ большая разница между работой dev версии и build.В build-версии весь код обфусцируется при компиляции в целях уменьшения размера, попробуйте вывести в консоль какой-нибудь объект - сразу увидите.
Поэтому прямо внутрь объектов залезть не получится. По-хорошему этого и не нужно делать, иначе есть вероятность получить непредсказуемые последствия, к тому же вы можете не знать, как взаимосвязаны те или иные свойства и, что они могут означать. Cо стороны пользователя объект должен представлять собой "черный ящик", а применять к нему нужно только методы API - в этом случае пользователь не должен задумываться о внутренней реализации объекта - это распространенный принцип.
Поэтому код надо переписать следующим образом:
var objs = [];
var excl_objs = ['Character'];
m_scs.get_all_objects("MESH").forEach(function(i){
var name = m_scs.get_object_name(i);
if (!excl_objs.includes(name) && name.indexOf("%meta") != 0) {
console.log(name);
objs.push(i);
};
});
exports.objs = objs;
i.name, i.type и i.bpy_origin - не стоит так брать, поэтому их можно заменить проверкам: "MESH" - параметр функции
get_all_objects, name - результат вызова m_scs.get_object_name, только с bpy_origin заминка - сейчас специального метода нет (добавим к этому релизу), поэтому можно проверить, что имя начинается не с "%meta" как у побочных объектов.
А в консоли по билд версии такая надпись начала красоваться:То же самое - так обращаться в скомпилированной версии нельзя. Нужно через метод require:
objs = b4w.scenes.get_all_objects()
VM41769:1 Uncaught TypeError: Cannot read property 'get_all_objects' of undefined(…)
objs = b4w.require("scenes").get_all_objects()
16 ноября 2016 12:42
16 ноября 2016 12:42
16 ноября 2016 12:59
16 ноября 2016 13:04
Я так полагаю, что заминка на этапе сбора перечня объектов. У меня есть файл, в котором я заранее собираю все переменные и там есть определение объектов. Так как load_cb вызывается после первого json, то vars не получает весь список объектов. Вместе с тем и растаскивать схожие функции по разным файлам я не хочу.
Вот думаю, если сделать отдельную функцию, которую вызвать callback после загрузки последнего json. А Вы такого рода объекты с перечнем чего-либо меняющегося динамически предусматриваете или каждый раз вызываете подбор объектов? Или делаете переменную с перечнем имен ключевых объектов, а потом их каждый раз собираете?
Вот думаю, если сделать отдельную функцию, которую вызвать callback после загрузки последнего json. А Вы такого рода объекты с перечнем чего-либо меняющегося динамически предусматриваете или каждый раз вызываете подбор объектов? Или делаете переменную с перечнем имен ключевых объектов, а потом их каждый раз собираете?
Ответ на сообщение пользователя Иван Любовников
А ошибки в консоли есть? Текстуры меняете после загрузки 2-го json'а?
Алексей