Forum

User posts Evgeny Rodygin
25 October 2014 16:05
Ответ на сообщение пользователя trepaning
to build on this: if forward motion is 1 and backwards is -1, what are left and right? I am looking to make A and D keys strafe Left and Right movement instead of rotate, as rotate is not needed with mouse look control.
As described in documentation for physics module, function
set_character_move_dir(obj, forw, side)

has third optional parameter which is exactly what you need.
24 October 2014 18:54
If you have already setup a character movement you can use the pointerlock.js addon. Don't forget to include it into your html-file if you are not using b4w.full.min.js.

You can use the following code to turn on firstperson controls:
var m_plock = require("pointerlock");
var m_cons = require("constraints");
var m_scs = require("scenes");
var m_main  = require("main");

function enable_firstperson_controls() {
    var character = m_scs.get_first_character();
    var camera = m_scs.get_active_camera();

    // make camera follow the character with offset [0, 0.5, 0]
    m_cons.append_stiff_trans(camera, character, [0, 0.5, 0]);

    // enable rotation with mouse
    var canvas_elem = m_main.get_canvas_elem();
    canvas_elem.addEventListener("mouseup", function(e) {
        m_plock.request_pointerlock(canvas_elem);
    }, false);
}


If you would like to change rotation speed, you may correct FPS_MOUSE_MULT value in pointerlock.js module.

Hope this will help.
24 October 2014 17:16
This also sounds interesting. Thanks for suggestion!
24 October 2014 17:06
Yes, this is a nice feature on pair with video textures. Will put this in our TODO list.
23 October 2014 16:51
Добрый день, и добро пожаловать на форум!

Концепцию сенсоров вы поняли совершенно верно.
В документации есть их описание и примеры применения. Насколько я понял, вы уже смотрели этот раздел, поэтому остановлюсь на ваших вопросах подробнее.

Какова роль logic_function?
Логическая функция, определяет, какие значения должны иметь сенсоры, чтобы вызвалась функция-обработчик. Например, есть логическая функция следующего вида:
function(s) {return s[0] && s[2]};
,где s - массив со значениями сенсоров в том порядке, в котором они задаются в массиве сенсоров. Если сенсоры под номерами 0 и 2 имеют положительное значение, то логическая функция так же будет положительной. Вызовется ли callback будет зависеть от типа выбранного manifold

какие параметры передаются в callback?
Callback имеет вид:
function(obj, manifold_id, pulse, param)

Здесь:
1) obj - объект, на котором "висит" manifold,
2) manifold_id - идентификатор манифолда, задаваемый при его создании.
3) pulse - параметр для манифолдов типа CT_CONTINUOS и CT_TRIGGER, определяющий, при каких обстоятельтвах был вызван callback. Чтобы понять, когда какие значения он принимает, я лучше приведу текст из исходников (logic_result - значение, которое вернула в данный момент логическая функция):
  switch (manifold.type) {
case exports.CT_CONTINUOUS:
if (logic_result) {
pulse = 1;
} else if (last_pulse == 1) {
pulse = -1;
} else
pulse = 0;
break;
case exports.CT_TRIGGER:
if (logic_result && last_pulse == -1) {
pulse = 1;
} else if (!logic_result && last_pulse == 1) {
pulse = -1;
} else
pulse = 0;
break;

4) param - это последний опциональный параметр, подаваемый в метод controls.create_sensor_manifold(). Это может быть любой нужный вам объект/значение/массив и т.п.

возможно ли в callback получить ссылку на объект сгенерировавший событие?
Вообще, далеко не все сенсоры вызываются каким-либо объектом. Поэтому такой возможности нет. Но в нашей модели первостепенную роль играет именно манифолд. Поэтому его и нужно создавать для того объекта с которым вы хотите провести какие-то манипуляции в обработчике.

Надеюсь, ответ получился не слишком запутанным