Нужна помощь

15 ноября 2016 17:04
Я понял, спасибо.

Голову сломал уже над тем, как корректно сразу развернуть персонаж под камеру, с которой отключается анимация.
Есть такая функция:
            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
Помогайте, друзья,

Я измучил уже персонажа пытаясь без ручного поворота камеры дать ему сразу нужный поворот.
Согласно консоли кватернионы корректно собираются.

[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].текущие_параметры_анимации - кадры, векторы и т.д - в консоли писала, что такого объекта просто не существует.

Не работает перечень объектов по этой функции в отдельном модуле.
    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" как у побочных объектов.

А в консоли по билд версии такая надпись начала красоваться:
objs = b4w.scenes.get_all_objects()
VM41769:1 Uncaught TypeError: Cannot read property 'get_all_objects' of undefined(…)
То же самое - так обращаться в скомпилированной версии нельзя. Нужно через метод require:
objs = b4w.require("scenes").get_all_objects()
16 ноября 2016 12:42
В продолжении темы: разница возникает между advanced и simple оптимизацией. Переключил на simple - заработали пути к текстурам.

При разделении на разные json для ускорения загрузки картинки текстур переключаются только для первого json. Что делать?
Алексей
16 ноября 2016 12:42
В продолжении темы: разница возникает между advanced и simple оптимизацией. Переключил на simple - заработали пути к текстурам.

При разделении на разные json для ускорения загрузки картинки текстур переключаются только для первого json. Что делать?
Алексей
16 ноября 2016 12:59
При разделении на разные json для ускорения загрузки картинки текстур переключаются только для первого json. Что делать?
А ошибки в консоли есть? Текстуры меняете после загрузки 2-го json'а?
16 ноября 2016 13:04
Я так полагаю, что заминка на этапе сбора перечня объектов. У меня есть файл, в котором я заранее собираю все переменные и там есть определение объектов. Так как load_cb вызывается после первого json, то vars не получает весь список объектов. Вместе с тем и растаскивать схожие функции по разным файлам я не хочу.
Вот думаю, если сделать отдельную функцию, которую вызвать callback после загрузки последнего json. А Вы такого рода объекты с перечнем чего-либо меняющегося динамически предусматриваете или каждый раз вызываете подбор объектов? Или делаете переменную с перечнем имен ключевых объектов, а потом их каждый раз собираете?

Ответ на сообщение пользователя Иван Любовников
А ошибки в консоли есть? Текстуры меняете после загрузки 2-го json'а?
Алексей
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.