Próbuję zaimplementować ruchy pierwszoosobowe za pomocą myszy. Mam to działa z klawiaturą, ale mam trudności z zaimplementowaniem go za pomocą myszy, ponieważ ruch do określonej strony nie jest tak oczywisty (tzn. Ruch w lewo może obejmować przesuwanie w górę lub w dół). Chcę użyć matrix3d
, aby otrzymać zmienione wartości pozycji. To jest jsfiddle.Sterowany myszką ruch pierwszej osoby JS
EDIT mam wklejony nowy kod udało mi się rozwiązać:
$(document).on('mousemove', function (e) {
var MOVE = 10; // how much to move
var XTURN = 1; // how much to rotate
var YTURN = 1; // how much to rotate
var transformer, origMat, translationMatrix, result;
transformer = document.getElementById("transformer");
if ($.browser.webkit)
origMat = new WebKitCSSMatrix(window.getComputedStyle(transformer).webkitTransform);
//turn left
if (e.pageX < xPrev) {
if (XTURN < 0) {
XTURN *= -1;
}
xPrev = e.pageX;
//turn right
} else {
if (XTURN > 0) {
XTURN *= -1;
}
xPrev = e.pageX;
}
//look up
if (e.pageY < yPrev) {
if (YTURN < 0) {
YTURN *= -1;
}
yPrev = e.pageY;
//look down
} else {
if (YTURN > 0) {
YTURN *= -1;
}
yPrev = e.pageY;
}
translationMatrix = new WebKitCSSMatrix("matrix3d(" + cos(XTURN).toFixed(10) + ",0," + sin(XTURN).toFixed(10) + ",0,0,"+ cos(-YTURN).toFixed(10) +","+ sin(YTURN).toFixed(10) +",0, " + sin(-XTURN).toFixed(10) + ","+ sin(-YTURN).toFixed(10) +"," + cos(XTURN).toFixed(10) + ",0,0,0,0,1)");
transformer.style.webkitTransform = translationMatrix.multiply(origMat).toString();
});
Jak widać (Niestety dla matrycy jednej linii) Jestem podając zmiany X i Obroty Y na tej samej zmianie matrycy, a następnie jej zatwierdzenie, problem jest teraz z cos(XTURN).toFixed(10)
, który może być powiązany z obrotami X i Y, więc możesz zobaczyć, że działa, ale nie jest doskonały. Doceniam wszelkie wskazówki/pomysły.
P.S Nie chcę korzystać z Pointer Lock API, mimo że jest świetny, ponieważ chcę, aby obsługiwał maksymalną liczbę przeglądarek.
Jeśli to działa, po co zmieniać w odpowiedzi lub usunąć pytanie (odpowiedź będzie lepiej). – FakeRainBrigand
To nie działa tak, jak powinno być, dlatego nie jest rozwiązane, więc wysłanie odpowiedzi na nie byłoby niewłaściwe. Opublikowaliśmy zmianę dotyczącą tego, co zmieniło się od czasu mojego pierwszego pytania. –
Przepraszam, źle mnie zrozumiałem. Myślałem, że powiedziałeś, że to rozwiązałeś. – FakeRainBrigand