论坛

由用户创建的信息 Ivan Lyubovnikov
18 August 2015 11:16

Ответ на сообщение пользователя Йеджи Заборовски
В тему:
код целиком был вставлен из примера. Только пришлось заменить нормаль пересечения пола с [0, 1, 0] на [0, 0,1 ] для изменения плоскости пересечения. Объекты изначально уже в сцене. при активации (нажатии мышкой ) и попытке перетащить, объекты дергаются в центр экрана и оттуда начинают перетаскиваться. Даже если позиция объекта была изменена перетаскиванием, при следующей попытке перетащить он снова дергается в центр и оттуда перетаскивается.
А задача: таскать объект по вертикальной плоскости на всю ее ширину. Да еще и по сетке хотелось бы.

Дергаться может, если сильно скачет точка пересечения луча и плоскости. Идеальным будет расположение плоскости перпендикулярно направлению взгляда камеры. Проверьте нормаль: [0,0,1] означает направление по -Y в блендере.
10 August 2015 10:58
Hi, rebit. Can you make sure that the response is from our Tornado server?

This is what you should find in the console:
03 August 2015 18:57
Спасибо, попробовал первый способ, все отлично работало пока не уменьшил экран до появления скрола.
Рад, что заработало, а случай со скроллом мы посмотрим на предмет багов.
30 July 2015 14:45
Здравстуйте, функционал такой есть, их даже два.

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-камера - это специфический вариант камеры. Мы не планировали его чересчур универсальным, поэтому непосредственно таких настроек нет, и оба ваших вопроса решаются только кодингом.

ограничить углы поворота по горизонтали (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