Форум

Базовый персонаж. Не работает WASD.

09 марта 2017 17:22
Подскажите пожалуйста почему у базового персонажа. https://www.blend4web.com/doc/ru/physics.html#basic-character

В Fast Preview WASD работает, а после экспорта сцены в html не работает.
09 марта 2017 18:08
Добрый день и добро пожаловать на форум.

При Fast Preview ваша сцена открывается в специльном просмотрщике, который называется Viewer. Он владеет кое-какой логикой и умеет находить персонажа и навешивать на него управление.

При экспорте в HTML просмотр сцены осуществляется в другом просмотрщике - в Webplayer, который является более простым и не имеет дело с персонажем.

Самый лучший способ для управления персонажем - это написать свой просмотрщик. В наиболее простом случае надо будет всего лишь кликнуть в Менеджере Проетов на Create project и вставить одну строку кода, которая создаст стандартное управление персонажем. Если вы используете SDK, то там есть пример, демка называется firstpirson (там домик в джунглях). Там навешивание управления выглядит следующим образом:
var m_fps       = require("fps");
m_fps.enable_fps_controls();
30 марта 2018 08:40
Всем привет. Уже давно мучаюсь с этим базовым персонажем. Ничего не работает.
1) var m_fps = require("fps");
m_fps.enable_fps_controls();
Не работает. Персонаж не ходит. При этом не указано надо ли создавать сам персонаж (например куб) и в блендере ставить ему характеристику Character.
2) Полностью разобрал урок firstperson. Сделал код как там и все равно персонаж не ходит. Я так полагаю большую роль играет сам пол (поверхность) на которой ходит персонаж. Я делаю обычный plain (mesh). Накладываю на него текстуру и ставлю в свойство материала Special: Collision. Второй аспект это камера. Ставлю тип eye и vertical rotation limits.
Сам блендер файл очень простой - пол, освещение, камера и куб в роли персонажа.

Вот js код.
"use strict"

// register the application module
b4w.register("UV66 VIRTUAL EXHIBITION_main", function(exports, require) {

// import modules used by the app
var m_app = require("app");
var m_cfg = require("config");
var m_data = require("data");
var m_preloader = require("preloader");
var m_ver = require("version");
var m_fps = require("fps");
var m_scs = require("scenes");
var m_cons = require("constraints");
var m_ctl = require("controls");
var m_phy = require("physics");
var m_cont = require("container");
var m_mouse = require("mouse");









// detect application mode
var DEBUG = (m_ver.type() == "DEBUG");

// automatically detect assets path
var APP_ASSETS_PATH = m_cfg.get_assets_path("UV66 VIRTUAL EXHIBITION");

/**
* export the method to initialize the app (called at the bottom of this file)
*/
exports.init = function() {
m_app.init({
canvas_container_id: "main_canvas_container",
callback: init_cb,
show_fps: DEBUG,
console_verbose: DEBUG,
physics_enabled: true,
show_fps: true,
autoresize: true
});
}

/**
* callback executed when the app is initialized
*/
function init_cb(canvas_elem, success) {

if (!success) {
console.log("b4w init failure");
return;
}

m_preloader.create_preloader();

// ignore right-click on the canvas element
canvas_elem.oncontextmenu = function(e) {
e.preventDefault();
e.stopPropagation();
return false;
};

load();
}

/**
* load the scene data
*/
function load() {
m_data.load(APP_ASSETS_PATH + "brick_floor.json", load_cb, preloader_cb);
}

/**
* update the app's preloader
*/
function preloader_cb(percentage) {
m_preloader.update_preloader(percentage);
}

/**
* callback executed when the scene data is loaded
*/
function load_cb(data_id, success) {

if (!success) {
console.log("b4w load failure");
return;
}

// m_app.enable_camera_controls();

// place your code here
var camobj = m_scs.get_active_camera();
var character = m_scs.get_first_character();
console.log(camobj);
var canvas_elem = m_cont.get_canvas();
canvas_elem.addEventListener("mouseup", function (e) {
m_mouse.request_pointerlock(canvas_elem);
}, false);




m_fps.enable_fps_controls();
m_fps.set_cam_smooth_factor(0.2);
m_fps.set_cam_sensitivity(80);

m_cons.append_stiff_trans(camobj, character, [0, 0.7, 0]);






setup_movement();


}


function setup_movement() {

var key_a = m_ctl.create_keyboard_sensor(m_ctl.KEY_A);
var key_s = m_ctl.create_keyboard_sensor(m_ctl.KEY_S);
var key_d = m_ctl.create_keyboard_sensor(m_ctl.KEY_D);
var key_w = m_ctl.create_keyboard_sensor(m_ctl.KEY_W);
var key_space = m_ctl.create_keyboard_sensor(m_ctl.KEY_SPACE);
var key_shift = m_ctl.create_keyboard_sensor(m_ctl.KEY_SHIFT);

var move_state = {
left_right: 0,
forw_back: 0
}

var move_array = [key_w, key_s, key_a, key_d, key_shift];
var character = m_scs.get_first_character();

/////////////////////////////
var move_cb = function(obj, id, pulse) {
if (pulse == 1) {
switch (id) {
case "FORWARD":
move_state.forw_back = 1;
break;
case "BACKWARD":
move_state.forw_back = -1;
break;
case "LEFT":
move_state.left_right = 1;
break;
case "RIGHT":
move_state.left_right = -1;
break;
case "RUNNING":
m_phy.set_character_move_type(obj, m_phy.CM_RUN);
break;
}
}
else {
switch (id) {
case "FORWARD":
case "BACKWARD":
move_state.forw_back = 0;
break;
case "LEFT":
case "RIGHT":
move_state.left_right = 0;
break;
case "RUNNING":
m_phy.set_character_move_type(obj, m_phy.CM_WALK);
break;
}
}


m_phy.set_character_move_dir(obj, move_state.forw_back, move_state.left_right);
}




m_ctl.create_sensor_manifold(character, "FORWARD", m_ctl.CT_TRIGGER,
move_array, function(s) { return s[0] }, move_cb);
m_ctl.create_sensor_manifold(character, "BACKWARD", m_ctl.CT_TRIGGER,
move_array, function(s) {return s[1]}, move_cb);
m_ctl.create_sensor_manifold(character, "LEFT", m_ctl.CT_TRIGGER,
move_array, function(s) {return s[2]}, move_cb);
m_ctl.create_sensor_manifold(character, "RIGHT", m_ctl.CT_TRIGGER,
move_array, function(s) {return s[3]}, move_cb);

var running_logic = function(s) {
return (s[0] || s[1] || s[2] || s[3]) && s[4];
}
m_ctl.create_sensor_manifold(character, "RUNNING", m_ctl.CT_TRIGGER,
move_array, running_logic, move_cb);


var jump_cb = function(obj, id, pulse) {
m_phy.character_jump(obj);
}
m_ctl.create_sensor_manifold(character, "JUMP", m_ctl.CT_SHOT,
[key_space], null, jump_cb);



};
/////////////////////



















});

// import the app module and start the app by calling the init method
b4w.require("UV66 VIRTUAL EXHIBITION_main").init();
02 апреля 2018 13:49
Есть ли ошибки в консоли браузера (F12)?
было бы горазно удобнее если бы вы выложили архив со всеми исходниками проекта, включая blend-файл
Александр (команда Blend4Web)
twitter
03 апреля 2018 14:03
b4w.js:224 B4W EXPORT ERROR: IMAGE texture type is not supported for world "World". See more details in https://www.blend4web.com/doc/en/addon.html#non-critical-export-errors
Только такая ошибка в консоли браузера. Может ли она повлиять???

Во вложении blend-файл, сам js-код, текстура пола (кирпичная кладка), json и bin файлы проекта.
05 апреля 2018 15:24
У меня все работает.
Собрал ваш проект из кусков, которые вы прикрепили.
Подправил только JS вот тут, были пробелы вместо подчеркивания:
var APP_ASSETS_PATH = m_cfg.get_assets_path("UV66_VIRTUAL_EXHIBITION");

Также накинул вашу текстуру в блендере.
Персонаж ходит и прыгает.
Александр (команда Blend4Web)
twitter
06 апреля 2018 13:15
Переделал на новый проект, где пути и названия без пробелов (через project manager). И все равно ничего не изменилось. НЕ работает.
Выскакивает одна ошибка в консоли -
b4w.js:224 B4W EXPORT ERROR: IMAGE texture type is not supported for world "World"
. Может ли она быть препятствием?
06 апреля 2018 13:48
Приложенный в предыдущем сообщении проект работает?
Александр (команда Blend4Web)
twitter
06 апреля 2018 13:48
Выскакивает одна ошибка в консоли -
b4w.js:224 B4W EXPORT ERROR: IMAGE texture type is not supported for world "World"
. Может ли она быть препятствием?
не может
Александр (команда Blend4Web)
twitter
06 апреля 2018 14:58
Ответ на сообщение пользователя Александр Романов
Приложенный в предыдущем сообщении проект работает?
В том то и дело, что не работает. Может быть конфигурация blend4web кривая??? Хотя все делал по инструкции на сайте.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.