Actualmente estoy creando un juego de disparos en 3D en primera persona en el navegador usando WebGL. ¿Cómo implementaría mouselook / free look para tal juego?
Actualmente estoy creando un juego de disparos en 3D en primera persona en el navegador usando WebGL. ¿Cómo implementaría mouselook / free look para tal juego?
Respuestas:
Mouselook ahora es compatible con Chrome y Firefox a través de la especificación W3C Pointer Lock . Esencialmente:
document.onmousemove = function (e) {
document.body.innerHTML = "<div>dx: " +
(e.movementX || e.mozMovementX || e.webkitMovementX || 0);
}
document.body.onclick = document.body.requestPointerLock ||
document.body.mozRequestPointerLock ||
document.body.webkitRequestPointerLock;
Un buen artículo de tutorial es Pointer Lock y First Person Shooter Controls en HTML5Rocks.
Capture mousemove
eventos y use las propiedades screenX
y screenY
del objeto de evento para actualizar la posición de la cámara (use el delta hasta el último screenX
y la screenY
posición para obtener la cantidad de movimiento).
Si tiene algún tipo de escena , podría construir una configuración de nodo como la siguiente:
CameraNode (Scene Node)
|
+- YawNode (Scene Node)
|
+- PitchNode (Scene Node)
|
+- Camera (actual Camera Object)
El movimiento en el eje X gira el YawNode y el movimiento en el eje Y gira el PitchNode. El CameraNode se moverá cuando el jugador se mueva.
Es bastante simple, y solo toma dos cosas.
Aquí hay un código fuente de muestra para hacer el manejo del evento. El módulo del sistema (que maneja toda la interacción del navegador del juego <-->) realiza un seguimiento de dos variables: lastMousePosition
y lastMouseDelta
.
Para rastrear la cámara con el mouse, solo necesita lastMouseDelta
saber cómo sabrá cuántos grados rotar cuadro por cuadro.
var canvas = /* WebGL rendering context */
canvas.onmousedown = function (event) { me.handleMouseDown(event); };
canvas.onmouseup = function (event) { me.handleMouseUp(event); };
canvas.onmousemove = function (event) { me.handleMouseMove(event); };
// snip
engine.SystemModule.prototype.handleMouseMove = function(event) {
this.lastMouseDelta = [event.clientX - this.lastMousePosition[0],
event.clientY - this.lastMousePosition[1]];
this.lastMousePosition = [event.clientX, event.clientY];
};
Aquí hay un código de muestra para manejar la rotación de la cámara. Dada la cantidad de píxeles que el mouse se ha movido en la dirección X o Y, gire la cámara tantos grados.
/**
* degrees/pixel
* @const
*/
var cameraMouseRotation = 0.5;
// Mouse movement for camera angle.
if (sys.isMouseDown()) {
var positionChange = sys.getLastMousePositionDelta();
camera.rotateYDegs(cameraMouseRotation * positionChange[0]);
camera.rotateXDegs(-cameraMouseRotation * positionChange[1]);
}
Más tarde, cuando realmente renderice su mundo, simplemente genere una matriz de vista de modelo desde su cámara. (Convirtiendo la posición, guiñada, inclinación y balanceo de la cámara en vectores que puede pasar a gluLookAt.) Y debería estar listo para comenzar.