Saat ini saya membuat game penembak orang pertama 3D di browser menggunakan WebGL. Bagaimana cara saya mengimplementasikan mouselook / look gratis untuk game semacam itu?
Saat ini saya membuat game penembak orang pertama 3D di browser menggunakan WebGL. Bagaimana cara saya mengimplementasikan mouselook / look gratis untuk game semacam itu?
Jawaban:
Mouselook sekarang didukung di Chrome dan Firefox melalui spesifikasi W3C Pointer Lock . Pada dasarnya:
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;
Artikel tutorial yang bagus adalah Pointer Lock dan First Person Shooter Controls di HTML5Rocks.
Capture mousemove
Acara dan menggunakan screenX
dan screenY
sifat dari objek acara untuk posisi pembaruan kamera (menggunakan delta untuk yang terakhir screenX
dan screenY
posisi untuk mendapatkan jumlah gerakan).
Jika Anda memiliki semacam scenegraph , Anda bisa membuat simpul-setup seperti berikut:
CameraNode (Scene Node)
|
+- YawNode (Scene Node)
|
+- PitchNode (Scene Node)
|
+- Camera (actual Camera Object)
Gerakan di X-Axis memutar YawNode dan gerakan di Y-Axis memutar PitchNode. CameraNode akan dipindahkan ketika pemain bergerak.
Ini cukup sederhana, dan hanya butuh dua hal.
Berikut beberapa contoh kode sumber untuk melakukan penanganan acara. Modul sistem (yang menangani semua interaksi browser permainan <-->) melacak dua variabel: lastMousePosition
dan lastMouseDelta
.
Untuk melacak kamera dengan mouse, Anda hanya perlu lastMouseDelta
bagaimana Anda akan tahu berapa derajat untuk memutar bingkai-ke-bingkai.
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];
};
Berikut beberapa contoh kode untuk menangani rotasi kamera. Mengingat jumlah piksel yang telah dipindahkan mouse ke arah X atau Y, putar kamera sebanyak itu.
/**
* 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]);
}
Kemudian, ketika Anda benar-benar melanjutkan untuk merender dunia Anda, cukup buat matriks model-view dari kamera Anda. (Mengkonversi posisi kamera, menguap, melempar, dan menggulung menjadi vektor yang bisa Anda lewati untuk gluLookAt.) Dan Anda harus baik-baik saja.