Reputation: 586
In Three.js, I would like to use THREE.quaternion to make the camera object rotate to the selected object.
I did search the web but found no example/demo or document about how to use this quaternion class.
I try my luck with following 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;
}
But it doesn't work. Did I miss something? Please help. Thanks in advance.
Upvotes: 14
Views: 32851
Reputation: 15
This is how I've done it :
Upvotes: 1
Reputation: 85
I have tried using it:
var newQuaternion = new THREE.Quaternion();
THREE.Quaternion.slerp(camera.quaternion, obj.quaternion, newQuaternion, 0.01);
camera.quaternion = newQuaternion;
camera.quaternion.normalize();
camera.matrixAutoUpdate();
However, I have failed to get the desired outcome. I know it is a fairly old post but I would be happy if someone could respond. I didn't see any other relevant posts other than this so really hoping for someone to respond.
Here is my problem in detail: Rotate camera to look at Selected object in three.js
Upvotes: 0
Reputation: 2696
You can use the method applyQuaternion from ThreeJs
const quaternion = new THREE.Quaternion(obj.position.x, obj.position.y, obj.position.z, 1);
camera.applyQuaternion(quaternion); // Apply Quaternion
camera.quaternion.normalize(); // Normalize Quaternion
Upvotes: 3
Reputation: 518
I think this line wont work:
obj.quaternion = new THREE.Quaternion(obj.position.x, obj.position.y, obj.position.z, 1);
You need to set
obj.useQuaternion = true
After adding object to scene, when you rotate it will be automatically applied to obj.quaternion
.
The second point is you should apply the object to your controls and not the camera. Because you want to control the object and not the camera?
Upvotes: 2
Reputation: 518
Slerp is quite easy. It takes 4 parameters:
targetRotation
the actual camera rotationdestinationRotation
the object rotationdestinationRotation
new quaternion which will be the new camera rotationpercentOfRotation
this parameter is playground, I'm using 0.07 here right now, could be value between 0 (0%) and 1 (100%)This is my rotation method:
var qm = new THREE.Quaternion();
THREE.Quaternion.slerp(camera.quaternion, destRotation, qm, 0.07);
camera.quaternion = qm;
camera.quaternion.normalize();
Hopefully this will help you. And don't bother I also worked some weeks on the perfect camera following.
Upvotes: 18