Ich erstelle gerade ein 3D-Ego-Shooter-Spiel im Browser mit WebGL. Wie würde ich Mouselook / Free Look für ein solches Spiel implementieren ?
Ich erstelle gerade ein 3D-Ego-Shooter-Spiel im Browser mit WebGL. Wie würde ich Mouselook / Free Look für ein solches Spiel implementieren ?
Antworten:
Mouselook wird jetzt in Chrome und Firefox über die W3C Pointer Lock- Spezifikation unterstützt. Im Wesentlichen:
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;
Ein guter Tutorial-Artikel ist Pointer Lock und First Person Shooter Controls auf HTML5Rocks.
Erfassen Sie mousemove
Ereignisse und verwenden Sie die Eigenschaften screenX
und screenY
des Ereignisobjekts, um die Kameraposition zu aktualisieren (verwenden Sie das Delta bis zum letzten screenX
und die screenY
Position, um den Bewegungsumfang zu ermitteln).
Wenn Sie eine Art Szenegraph haben , können Sie ein Knoten-Setup wie das folgende erstellen:
CameraNode (Scene Node)
|
+- YawNode (Scene Node)
|
+- PitchNode (Scene Node)
|
+- Camera (actual Camera Object)
Die Bewegung in der X-Achse dreht den YawNode und die Bewegung in der Y-Achse dreht den PitchNode. Der CameraNode wird verschoben, wenn sich der Player bewegt.
Es ist ganz einfach und erfordert nur zwei Dinge.
Hier ist ein Beispiel-Quellcode für die Ereignisbehandlung. Das Systemmodul (das alle <-> Browser-Interaktionen des Spiels abwickelt) verfolgt zwei Variablen: lastMousePosition
und lastMouseDelta
.
Um die Kamera mit der Maus zu verfolgen, müssen Sie nur lastMouseDelta
wissen, um wie viel Grad Sie sich von Bild zu Bild drehen müssen.
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];
};
Hier ist ein Beispielcode für die Handhabung der Kameradrehung. Drehen Sie die Kamera angesichts der Anzahl der Pixel, die die Maus in X- oder Y-Richtung bewegt hat, um so viele Grad.
/**
* 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]);
}
Wenn Sie später tatsächlich Ihre Welt rendern, generieren Sie einfach eine Modellansichtsmatrix aus Ihrer Kamera. (Konvertieren Sie die Position, das Gieren, die Neigung und das Rollen der Kamera in Vektoren, die Sie an gluLookAt übergeben können.) Und Sie sollten bereit sein, loszulegen.