由用户创建的信息 Ivan Lyubovnikov
18 August 2015 11:16
Ответ на сообщение пользователя Йеджи Заборовски
В тему:
код целиком был вставлен из примера. Только пришлось заменить нормаль пересечения пола с [0, 1, 0] на [0, 0,1 ] для изменения плоскости пересечения. Объекты изначально уже в сцене. при активации (нажатии мышкой ) и попытке перетащить, объекты дергаются в центр экрана и оттуда начинают перетаскиваться. Даже если позиция объекта была изменена перетаскиванием, при следующей попытке перетащить он снова дергается в центр и оттуда перетаскивается.
А задача: таскать объект по вертикальной плоскости на всю ее ширину. Да еще и по сетке хотелось бы.
Дергаться может, если сильно скачет точка пересечения луча и плоскости. Идеальным будет расположение плоскости перпендикулярно направлению взгляда камеры. Проверьте нормаль: [0,0,1] означает направление по -Y в блендере.
10 August 2015 10:58
03 August 2015 18:57
30 July 2015 14:45
Здравстуйте, функционал такой есть, их даже два.
1) Как это сделано в приложении cartoon_interior.html:
- по 2d координатам канваса рассчитывается направляющий вектор луча, выходящего из камеры:
calc_ray
- затем ищется точка пересечения этого луча с заданной плоскостью (задается через нормаль):
Вот выдержка из статьи:
Рассмотрим подробнее функцию line_plane_intersect():
var point = m_util.line_plane_intersect(FLOOR_PLANE_NORMAL, 0,
cam_trans, camera_ray, _vec3_tmp3);
Она служит для определения точки пересечения прямой и плоскости. Первые два параметра задают плоскость, а именно нормаль (использована константа FLOOR_PLANE_NORMAL) и расстояние от плоскости до центра координат (равно нулю). Эти значения были подобраны в соответствии с моделью комнаты. Также подаются координаты камеры в мировом пространстве (cam_trans) и направляющий вектор прямой (camera_ray).
2) С другой стороны можно воспользоваться возможностями физики движка как в демке "Ray Test" приложения Code Snippets:
Здесь также рассчитывается луч, и далее создается тест на пересечение лучом препятствий (функция append_ray_test_ext). В коллбэк ray_test_cb должна прийти позиция в параметре hit_pos. Параметр "ANY" означает пересечение с любым объектом.
1) Как это сделано в приложении cartoon_interior.html:
- по 2d координатам канваса рассчитывается направляющий вектор луча, выходящего из камеры:
var camera_ray = m_cam.calc_ray(cam, x, y, _vec3_tmp);
calc_ray
- затем ищется точка пересечения этого луча с заданной плоскостью (задается через нормаль):
var point = m_util.line_plane_intersect(FLOOR_PLANE_NORMAL, 0, cam_trans, camera_ray, _vec3_tmp2);
Вот выдержка из статьи:
Рассмотрим подробнее функцию line_plane_intersect():
var point = m_util.line_plane_intersect(FLOOR_PLANE_NORMAL, 0,
cam_trans, camera_ray, _vec3_tmp3);
Она служит для определения точки пересечения прямой и плоскости. Первые два параметра задают плоскость, а именно нормаль (использована константа FLOOR_PLANE_NORMAL) и расстояние от плоскости до центра координат (равно нулю). Эти значения были подобраны в соответствии с моделью комнаты. Также подаются координаты камеры в мировом пространстве (cam_trans) и направляющий вектор прямой (camera_ray).
2) С другой стороны можно воспользоваться возможностями физики движка как в демке "Ray Test" приложения Code Snippets:
var from = new Float32Array(3);
var to = new Float32Array(3);
...
var ray_test_cb = function(id, hit_fract, obj_hit, hit_time, hit_pos, hit_norm) {...}
var mouse_cb = function(e) {
var x = e.clientX;
var y = e.clientY;
m_cam.calc_ray(m_scenes.get_active_camera(), x, y, to);
m_vec3.scale(to, 100, to);
var obj_src = m_scenes.get_active_camera();
var id = m_phy.append_ray_test_ext(obj_src, from, to, "ANY",
ray_test_cb, true, false, true, true);
}
Здесь также рассчитывается луч, и далее создается тест на пересечение лучом препятствий (функция append_ray_test_ext). В коллбэк ray_test_cb должна прийти позиция в параметре hit_pos. Параметр "ANY" означает пересечение с любым объектом.
23 July 2015 17:32
Ответ на сообщение пользователя Onis
Здравствуйте, все получилось сделать, только столкнулся с одним затруднением, не смог получить ограничение vercatal translation limits of the HOVER camera , не нашел нужного метода в api, сделал заплатку, но вообще такую функцию надо бы встроить в api
ок, метод будет доступен в ближайшем релизе
17 July 2015 18:37
Здравствуйте, hover-камера - это специфический вариант камеры. Мы не планировали его чересчур универсальным, поэтому непосредственно таких настроек нет, и оба ваших вопроса решаются только кодингом.
Можно получить текущие азимутальный и угол подъема камеры функцией get_camera_angles(), затем сравнить с граничными и повернуть камеру обратно, если мы вылезли за границы (функцией rotate_camera() или rotate_hover_camera()).
По такому же алгоритму работают ограничения для камер типов EYE/TARGET внутри движка.
Ограничения можно менять методами apply_vertical_limits() и apply_horizontal_limits(), привязавшись к расстоянию до pivot-точки камеры. Её положение возвращается методом get_hover_cam_pivot().
Возможно, подстройку ограничений стоит имплементировать в движке, но тут мы ещё будем думать.
ограничить углы поворота по горизонтали (Use Horizontal Rotation)
Можно получить текущие азимутальный и угол подъема камеры функцией get_camera_angles(), затем сравнить с граничными и повернуть камеру обратно, если мы вылезли за границы (функцией rotate_camera() или rotate_hover_camera()).
По такому же алгоритму работают ограничения для камер типов EYE/TARGET внутри движка.
можно ли задать ограничения на передвижение по x y относительно зума
Ограничения можно менять методами apply_vertical_limits() и apply_horizontal_limits(), привязавшись к расстоянию до pivot-точки камеры. Её положение возвращается методом get_hover_cam_pivot().
Возможно, подстройку ограничений стоит имплементировать в движке, но тут мы ещё будем думать.
18 June 2015 14:51
Ответ на сообщение пользователя Кирилл
А есть возможность переключать окружающее освещение без выгрузки первой сцены из другого подгруженного json файла?
Сейчас такой возможности нет. Да и при выгрузке именно главной сцены с помощью data.unload(), удаляется абсолютно все, поэтому это даже не переключение, а, скорее, загрузка нового уровня.
Освещение обсуждалось ещё в этой теме, но с тех пор принципиально ничего не поменялось.
11 June 2015 10:29
Сразу вопрос: можно как-нибудь поменять углы обзора камеры программно? В документации не нашел подходящих методов.
Если вы о Field of View, то об этом уже писали в этой теме.
А если про лимиты углов обзора камеры, то тут подойдут методы apply_horizontal_limits, apply_vertical_limits из модуля camera.
29 May 2015 12:53
Обратная перспектива, как я понимаю, связана с модифицированной матрицей проекции для обычной персп. камеры. В блендере матрица недоступна через Python API и, судя по всему, собирается уже на сишнике из настроек и свойств камеры.
Связанный вопрос про матрицу
Т.е., скорее всего, надо патчить блендер, менять исходники.
Связанный вопрос про матрицу
Т.е., скорее всего, надо патчить блендер, менять исходники.
26 May 2015 17:35
Ответ на сообщение пользователя Shaman
Прошу прощения. При выставлении Focal length в блендере и экспорте сцены, фокусное расстояние сменилось как надо, что-то я в прошлый раз не досмотрел.
По сути мне теперь через api не придется его менять, так что вопрос с get_fov пока более для меня не актуален.
ОК. По поводу set/get_fov: может быть у вас старая версия движка, они добавились где-то в апреле, т.е. с версии 15.04