Now that I am on the most recent version of Gladius for my solar system example, I would like to play about with some of the new features available in 0.2. Tonight I start with gladius-input, an extension that should make working with user input better.
There does not seem to be much documentation yet for gladius-input, but there is an example: the tank simulation makes use of gladius-input.
First up, I need to require the extension:
require(
[ "gladius-core",
"gladius-cubicvr",
"gladius-input" ],
function( Gladius, cubicvrExtension, inputExtension ) {
// ...
});
As with the rendering extension, I must register the input extension. I copy the configuration object from the tank example to do so: // ...
var inputOptions = {
dispatcher: {
element: document
}
};
engine.registerExtension( inputExtension, inputOptions );
// ...
It seems that there will be an event dispatcher listening for events on the pages's document
element.Next up, I need to load in a "control map". This is not done with require.js, but rather with the Gladius engine's
get()
which I have mostly used for mesh and material loading until now: engine.get(
[
// ...
// input extension
{
type: engine.findExtension( "gladius-input" ).Map,
url: "camera-controls.json",
onsuccess: function( inputMap ) {
resources.cameraControls = inputMap;
},
onfailure: function( error ) {
}
}
],
{
oncomplete: game.bind( null, engine, resources )
}
);
I adapt camera-controls.json
from the tank example to allow for panning up and down with the camera:{ "States": { "PanUp": [ "J" ], "PanDown": [ "K" ], } }That is a nice, semantic mapping of keyboard input to controls, but I still need to map the
PanUp
and PanDown
"states" into actual changes.For that, I add a controller and an actor to my existing camera definition:
function game( engine, resources ) {
var space = new engine.SimulationSpace();
var cubicvr = engine.findExtension( "gladius-cubicvr" );
var input = engine.findExtension( "gladius-input" );
// ...
space.add( new engine.Entity( "camera1",
[
new engine.core.Transform([0,0,-23], [Math.PI, 0, 0]),
new cubicvr.Camera(),
new input.Controller( resources.cameraControls ),
new engine.logic.Actor( cameraLogic )
]
));
// ...
}
The resources.cameraControls
are what just got loaded from the camera-controls.json
file. What is that "Actor" thingy? The actor is what maps the camera controls into actual action: var cameraLogic = {
"Update": function( event ) {
if( this.owner.hasComponent( "Controller" ) ) {
var controller = this.owner.findComponent( "Controller" );
var transform = space.findNamed( "camera1" ).findComponent( "Transform" );
if( controller.states["PanUp"] ) {
console.log( this.owner.id, "Pan Up!" );
var direction = math.transform.translate( [space.clock.delta * 0.001, 0, 0] );
var rotation = math.transform.rotate( transform.rotation );
direction = math.matrix4.multiply( [direction, rotation] );
direction = [direction[12], direction[13], direction[14]];
transform.setPosition( math.vector3.add( direction, transform.position ) );
}
if( controller.states["PanDown"] ) {
console.log( this.owner.id, "Pan Down!" );
var direction = math.transform.translate( [space.clock.delta * -0.001, 0, 0] );
var rotation = math.transform.rotate( transform.rotation );
direction = math.matrix4.multiply( [direction, rotation] );
direction = [direction[12], direction[13], direction[14]];
transform.setPosition( math.vector3.add( direction, transform.position ) );
}
}
}
};
I need to adapt those controls to setRotation()
instead of the setPostion()
that I copied from the tank example. Even so, this works as I see the camera move back and forth when I press "J" and "K". Additionally, I see the logging in the JavaScript console:21BCB0FC5-DBA1-42BA-B930-33703CF37592 Pan Down! retrograde.js:267 75 retrograde.js:387 21BCB0FC5-DBA1-42BA-B930-33703CF37592 Pan Down! retrograde.js:267 75 retrograde.js:387 21BCB0FC5-DBA1-42BA-B930-33703CF37592 Pan Down! retrograde.js:267 75 retrograde.js:387 1BCB0FC5-DBA1-42BA-B930-33703CF37592 Pan Down! retrograde.js:267 218That will serve as a good stopping point for tonight. I will continue exploring gladius-input tomorrow, but this is a promising start.
Day #436
No comments:
Post a Comment