2012-07-26 8 views
8

In Three.js möchte ich THREE.quaternion verwenden, um das Kameraobjekt zum ausgewählten Objekt rotieren zu lassen.Three.js So verwenden Sie quaternion zum Drehen der Kamera

Ich habe das Web gesucht, aber kein Beispiel/Demo oder Dokument über die Verwendung dieser Quaternion-Klasse gefunden.

Ich versuche mein Glück mit folgendem Code:

camera = new THREE.PerspectiveCamera(40, window.innerWidth/window.innerHeight, 1, 10000); 
    camera.position.y = 10; 
    camera.position.z = 0; 
    camera.position.x = radious; 
    camera.useQuaternion = true; 

    // I did use the TrackballTrackballControls. Maybe it causes the problem so I put it here 
    controls = new THREE.TrackballControls(camera, document.getElementById(_canvasElement)); 

    // function to make the camera rotate to the object 
    function focusOn3DObject(obj){ 
     obj.useQuaternion = true; 
     obj.quaternion = new THREE.Quaternion(obj.position.x, obj.position.y, obj.position.z, 1); 

     var newQuaternion = new THREE.Quaternion(); 
     THREE.Quaternion.slerp(camera.quaternion, obj.quaternion, newQuaternion, 0.07); 
     camera.quaternion = newQuaternion; 
    } 

Aber es funktioniert nicht. Habe ich etwas verpasst? Bitte helfen. Danke im Voraus.

+2

Beachten Sie, dass 'useQuaternion' in neueren THREE.js-Builds entfernt wurde. Die Bibliothek verwendet jetzt standardmäßig Quaternionen. –

+0

Beachten Sie auch, dass heute (Aug/2015) THREE's Camera-Objekte eine Methode .lookAt (vector3) haben - sie erhalten einen Vector3 mit der Position eines Objekts zum Betrachten. Sie können jede object3d.position als Parameter übergeben, damit die Kamera sie betrachten kann. Schau es dir an: http://threejs.org/docs/index.html#Reference/Cameras/Camera – Tiago

Antwort

1

Ich denke, diese Zeile nicht funktionieren:

obj.quaternion = new THREE.Quaternion(obj.position.x, obj.position.y, obj.position.z, 1); 

Sie benötigen

obj.useQuaternion = true 

Nach einzustellen Objekt Szene hinzufügen, wenn Sie drehen wird es automatisch auf obj.quaternion angewendet werden.

Der zweite Punkt ist, dass Sie das Objekt auf Ihre Steuerelemente und nicht die Kamera anwenden sollten. Weil Sie das Objekt und nicht die Kamera steuern wollen?

+0

Ich möchte die Kamera drehen und auf das Objekt fokussieren. Die Kamera würde sich um das Objekt bewegen. Also ich denke, dass die Kamera kontrolliert wird. War ich falsch? – user1533481

+0

Es sieht aus wie ich im Dunkeln finde, da es kein Dokument oder ein Beispiel dazu gibt :(. Könntest du mir bitte die Funktion slerp erklären? Wofür sind die Parameter? Ich habe deinen Vorschlag ausprobiert, aber nicht erfolgreich. – user1533481

+6

Hinweis In neueren Builds von THREE.js wurde 'useQuaternion' entfernt. Die Bibliothek verwendet jetzt standardmäßig Quaternionen. –

13

Slerp ist ziemlich einfach. Es dauert 4 Parameter:

  • targetRotation die eigentliche Kamera-Dreh
  • destinationRotation das Objekt Rotation
  • destinationRotation neue Quaternion, die die neue Kamera-Dreh
  • percentOfRotation dieser Parameter Spielplatz sein, ich bin mit 0,07 Hier könnte jetzt Wert zwischen 0 (0%) und 1 (100%) sein

Dies ist meine Rotationsmethode:

var qm = new THREE.Quaternion(); 
THREE.Quaternion.slerp(camera.quaternion, destRotation, qm, 0.07); 
camera.quaternion = qm; 
camera.quaternion.normalize(); 

Hoffentlich hilft Ihnen das. Und nicht stören, ich habe auch einige Wochen an der perfekten Kamera gearbeitet.

+0

Hallo, in der Dokumentation hat .slerp nur 2 Parameter ... https://threejs.org/docs/#Reference /Math/Quaternion ... Habe ich etwas missverstanden? –

+0

@ SébastienGarcia-Roméo Es gibt zwei Slerp-Methoden auf Quaternion - die in dieser Antwort verwendete ist die statische. Beide sind auf der [quaternion docs page] aufgelistet (https: //threejs.org/docs/#api/math/Quaternion.slerp), aber die statische Methode befindet sich unten. –

Verwandte Themen