2013-02-22 17 views
10

Ich habe eine Kamera, die sich in der Szene auf verschiedene Arten bewegt. Die Kamera sollte sich um eine Zielposition drehen. In meinem Fall ist dies ein Punkt in einem Netz, auf das der Nutzer abgezielt hat. Da die Kamera normalerweise nicht relativ zu diesem Punkt bewegt werden muss, konnte ich die Pivot-Idee hier nicht verwenden: https://github.com/mrdoob/three.js/issues/1830. Meine aktuelle Lösung verwendet den folgenden Code ein:Three.js Kamera um ein Objekt drehen (das sich bewegen kann)

var rotationY = new THREE.Matrix4(); 
var rotationX = new THREE.Matrix4(); 
var translation = new THREE.Matrix4(); 
var translationInverse = new THREE.Matrix4(); 
var matrix = new THREE.Matrix4(); 
function rotateCameraAroundObject(dx, dy, target) { 
    // collect up and right vectors from camera perspective 
    camComponents.up = rotateVectorForObject(new THREE.Vector3(0,1,0), camera.matrixWorld); 
    camComponents.right = rotateVectorForObject(new THREE.Vector3(1,0,0), camera.matrixWorld); 

    matrix.identity(); 

    rotationX.makeRotationAxis(camComponents.right, -dx); 
    rotationY.makeRotationAxis(camComponents.up, -dy); 
    translation.makeTranslation(
     target.position.x - camera.position.x, 
     target.position.y - camera.position.y, 
     target.position.z - camera.position.z); 
    translationInverse.getInverse(translation); 

    matrix.multiply(translation).multiply(rotationY).multiply(rotationX).multiply(translationInverse); 
    camera.applyMatrix(matrix); 
    camera.lookAt(target.position); 
} 

Das Problem ist, dass wir nicht wollen, LookAt verwenden, da der Neuausrichtung. Wir möchten diese Zeile entfernen können.

Wenn wir den obigen Code ohne LookAt verwenden, drehen wir um den Punkt, aber wir betrachten den Punkt nicht. Mein Verständnis ist, dass meine Methode die Ansicht der Kamera so sehr drehen sollte, wie die Kamera selbst gedreht wird, aber stattdessen wird die Kamera nur eine kleine Menge gedreht. Kann mir jemand helfen zu verstehen, was los ist?

EDIT: Bereinigt den ursprünglichen Post und Code, um meine Frage hoffentlich zu klären.

Mein Denken ist, dass ich auf den Ursprung übersetzen kann (meine Zielposition), meinen gewünschten Betrag drehen, und dann in die Anfangsposition zurück zu übersetzen. Aufgrund der Rotation erwarte ich, dass ich in einer neuen Position bin und auf den Ursprung schaue.

In der Tat, Ich teste es jetzt ohne die Übersetzung Matrizen verwendet werden, so dass die Matrixmultiplikation Linie ist:

matrix.multiply(rotationY).multiply(rotationX); 

und es scheint das gleiche verhalten werden. Danke für die Hilfe bis jetzt!

ONE MORE THING! Ein Teil des Problems besteht darin, dass sich die Kamera in der Nähe des Nord- oder Südpols schlecht verhält. Ich bin auf der Suche nach einem "Frei-Roaming".

+0

(1) 'camera.lookAt (Vektor)' nimmt keine 'Matrix' als Argument. (2) Was genau versuchst du zu tun? – WestLangley

+0

Ich habe es versaut, während ich versucht habe, meinen Code aufzuräumen, tut mir leid! Ich habe den Beitrag bearbeitet die richtigen Informationen zu reflektieren – maaachine

+0

ich bin für die genau die gleiche Sache suchen .. in 2017. ich etwas verpasst haben, aber ich hoffe wirklich, ich habe zu meinem Calc Lehrbuch nicht herausziehen und erneut Vektoren und 3D trig. Ich möchte einfach "frei" um ein Objekt rotieren können. Es ist in der Tat ein bisschen schwierig. – dylnmc

Antwort

0

Die Gimbal-Sperre, auf die Sie sich beziehen (Neuausrichtung), ist wegen der Verwendung von Euler-Winkeln in der Standardimplementierung des Kamera-Lookats. Wenn Sie

camera.useQuaternion = true; 

vor Ihrem Anruf zu sehen, werden Euler Winkel nicht verwendet werden. Würde das dein Problem lösen?

+0

Das scheint es nicht zu beheben, aber danke! – maaachine

9

Folgendes in die Render-Schleife Put:

camera.position.x = target.position.x + radius * Math.cos(constant * elapsedTime);   
camera.position.z = target.position.z + radius * Math.sin(constant * elapsedTime); 
camera.lookAt(target.position); 

renderer.render(scene, camera); 

Alternativ Sie THREE.OrbitControls oder THREE.TrackballControls verwenden können. Siehe die three.js-Beispiele.

+0

Hmm, so etwas könnte funktionieren. Ich brauche das, um sich frei in alle drei Richtungen zu bewegen. Eines der Hauptprobleme ist die Art und Weise, wie es die Rotation in der Nähe von Polen handhabt. Ich habe den ursprünglichen Beitrag aktualisiert, um das zu verdeutlichen! (hoffnungsvoll) – maaachine

Verwandte Themen