First-person-simulation mit three.js mit der Tastatur Pfeile
Für meine Quelle, besuchen http://jsfiddle.net/fYtwf/
Hintergrund
Habe ich eine einfache 3d-simulation mit three.js wo die Kamera ist umgeben in 3 Dimensionen Würfel schneiden. Diese Würfel sind zu helfen, zu visualisieren, wo die Kamera schaut, bis der Blick steuert, kodiert und getestet. Ich möchte zum erstellen einer einfachen 3D-Anwendung, wo die Kamera gesteuert wird über bis, unten, Links und Recht Tasten. Wie verschieben Sie Ihren Kopf
Fragen
In meiner aktuellen Anwendung, wenn nach vorne und aufwärts, sind wir erfolgreich. Aber wenn wir drehen Links 90 Grad, und wir drücken den Pfeil nach oben... Das falsche, was passiert. die Kamera-Schritten die x-Achse, sondern weil wir es mit einer anderen Richtung, indem die x-Achse ALLEIN ist FALSCH...
Nun ich gehe davon aus dies ist, weil einige der Trigonometrie erforderlich ist, berechnen Sie die richtigen Werte für die z-Achse. Aber, meine trig ist nicht Brillant.
Aktuellen
Besser verstehen, was ich meine, bitte besuchen Sie mein jsfiddle : http://jsfiddle.net/fYtwf/
BIS Schlüssel NUR in Schritten X
UNTEN Schlüssel NUR dekrementiert X
LINKS Schlüssel NUR in Schritten Y
RECHT Schlüssel NUR dekrementiert Y
Q Schlüssel NUR in Schritten Z
W Schlüssel NUR dekrementiert Z
( Q und W wurden nur codiert, um zu versuchen und helfen Sie mir zu verstehen. )
Aus meinem aktuellen Verständnis, wenn ich drücken Sie die UP-Taste, X ansteigen muss und die Z-Achse modifiziert werden müssen, basierend auf dem, was die aktuelle Y-Achse ist. Allerdings weiß ich nicht, den Algorithmus 🙁
Also X und Z müssen geändert werden, auf die KEYUP-code ( glaube ich, bitte korrigiert mich wenn ich falsch Liege )
//setRotateX, getRotateX, setRotateY and getRotateY are extended
//camera functions I wrote so I could work with degrees. Solution
//IS NOT required to use them, they just helped me
switch( key )
{
case KEYUP:
if ( camera.getRotateX() < 90 ){ //restrict so they cannot look overhead
camera.setRotateX( camera.getRotateX() + VIEW_INCREMENT );
}
break;
case KEYDOWN:
if ( camera.getRotateX() > -90 ){ //restrict so they cannot look under feet
camera.setRotateX( camera.getRotateX() - VIEW_INCREMENT );
}
break;
case KEYLEFT:
camera.setRotateY( camera.getRotateY() + VIEW_INCREMENT );
break;
case KEYRIGHT:
camera.setRotateY( camera.getRotateY() - VIEW_INCREMENT );
break;
}
- So komisch ist das drehen auf der y-Achse Transformationen der z-Achse, nicht aber die x-Achse. Vielleicht ist es ein bug?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Reihe von Lösungen für dieses problem, aber da du nur die Kamera drehen nach oben, unten, Links und rechts, die Antwort in diesem Fall ist einfach.
Brauchen Sie nur die Kamera Euler, um zu "YXZ" wie so:
Wenn Sie das tun, wird alles sehr intuitiv.
Hier ist eine aktualisierte fiddle: http://jsfiddle.net/fYtwf/3/ (diese demo ist mit r.54, jedoch)
Sobald Sie ändern
camera.rotation.z
von der default-Wert vonzero
ist, werden die Dinge sehr verwirrend. So tun Sie das nicht. 🙂three.js r.65
Wobei das nicht direkt reparieren Ihren code, ich dachte, ich würde erwähnen, dass Three.js bietet zwei ready-made-Controller navigieren Sie im FPS-Modus. Beide verwenden Maus für das suchen und verschieben kann, sollte aber Recht einfach anpassen, um die Tastatur schauen, und entfernen Sie die Bewegung, wenn nötig. Sie sind:
FirstPersonControls
PointerLockControls
Ich würde letzteres empfehlen, als Ausgangspunkt, weil es ziemlich einfach und der ehemaligen verwirrend ist die Suche code zweimal, wahrscheinlich als ein Artefakt aus alten Funktionen.
FirstPersonControls
... 🙂Habe ich ein Beispiel erstellt, was genau Sie suchen - eine chase-Kamera (folgt ein Feld herum) an:
http://stemkoski.github.com/Three.js/#chase-camera