Move camera

29 августа 2016 10:08
Здравствуйте, скажите пожалуйста, какую Api функцию использует нода MOVE CAMERA, если используется несколько функций, то в каком модуле это можно посмотреть?
И нет ли чего-нибудь подобного просто для 3д объектов?
29 августа 2016 10:29
Заметил ноду MOVE TO, но тоже не знаю какую api она использует
29 августа 2016 15:01
Вы можете посмотреть реализацию нод в файле logic_nodes.js, функции move_camera_handler и move_to_handler. Но не все необходимые фукции вынесены во внешний API. Поэтому в зависимости от конкретной задачи нужно искать соответствующие функции во внешнем API. Возможно вам нужны функции set_translation и set_rotation из модуля transform.
Александр (команда Blend4Web)
twitter
29 августа 2016 15:14
У меня такая задача, у менять есть планета, на орбите планеты есть 3д объект (корабль), на планету можно нажимать в какой-то точке, и мне нужно с анимацией сместить корабль на позицию над точкой нажатия, то есть почти как moveTO только по окружности.
30 августа 2016 11:26
Здесь можно посмотреть код по ray test для получения точки перемещения корабля.

Для позиционирования лучше всего использовать tsr - [X, Y, Z, SCALE, QUAT_X, QUAT_Y, QUAT_Z, QUAT_W]. Если центр планеты совпадает с началом координат, то вам нужно повернуть вектор смещения корабля [X, Y, Z] и изменить поворот самого корабля [QUAT_X, QUAT_Y, QUAT_Z, QUAT_W] на некоторый предварительно вычисленный кватернион, который получить интерполированием начального кватерниона и конечного при помощи функции lerp по времени (для получения плавной анимации). Конечный кватернион надо вычислять исходя из точки конечного положения и направления единичного кватерниона (0, 0, 0, 1).
Александр (команда Blend4Web)
twitter
30 августа 2016 12:59
Спасибо, а можно чуть подробнее про вычисление конченого кватерниона?
31 августа 2016 14:17
Я бы рекомендовал следующий подход.
Создать Empty-объект в центре планеты. Припарентить к нему космический корабль. Таким образом, мы имеем связку, позволяющую простым вращением Empty точно поворачивать и смещать корабль по окружности.
По программной части так же можно воспользоваться интерполированием кватерниона, только лучше исользовать функцию quat.slerp

Если предположить, что конечная точка, где должен оказать корабль имеет координаты end_trans, то код инициализации выглядел бы примерно так:
var start_quat = m_trans.get_rotation(empty); 
var trans = m_trans.get_translation(empty);
var start_dir = m_util.quat_to_dir(start_quat, _vec3_tmp);

var end_dir = m_vec3.subtract(end_trans, trans, _vec3_tmp_2);
m_vec3.normalize(end_dir, end_dir);
var end_quat = m_util.dir_to_quat(end_dir, m_util.AXIS_Z);


Дальше остаётся только проинтерполировать значения поворота с течением фремени с помощью quat.slerp.
31 августа 2016 17:22
Спасибо большое все получилось, но через m_quat.rotationTo().
Но работает и это здорово.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.