I am trying to rotate camera around all axises and. lookAt methos uses camera.up vector, and when camera rotates above 180 and under -180 degress camera.up vector keep camera orientation. I expect camera works like spaceship rotation.
How to implement rotation like lookAt function?
I apply object quaternion(spaceship model) to camera. Then use lookAt method, but it works not expected when rotation around local x axis of the ship.
const cameraOffset = new Vector3(0, 2, 3)
cameraOffset.applyQuaternion(this.ship.quaternion)
cameraOffset.add(this.ship.position)
// camera position
this.position.lerp(cameraOffset, 0.1)
this.tjsObject.position.copy(this.position)
const cameraLookAt = new Vector3(0, 1, -5)
cameraLookAt.applyQuaternion(this.ship.quaternion)
cameraLookAt.add(this.ship.position)
this.lookAt.lerp(cameraLookAt, 0.1)
this.tjsObject.lookAt(this.lookAt)
Given a normalized vector to the target and -Camera.getWorldDirection, the function Quaternion.setFromUnitVectors should create a quaternion that will perform the rotation.
update() {
const cameraOffset = new Vector3(0, 2, 5)
const cameraLookAt = new Vector3(0, 1, -5)
cameraOffset.applyQuaternion(this.ship.quaternion)
cameraOffset.add(this.ship.position)
cameraLookAt.applyQuaternion(this.ship.quaternion)
cameraLookAt.add(this.ship.position)
const f = new Vector3()
this.tjsObject.getWorldDirection(f)
f.normalize()
cameraLookAt.normalize()
const q = new Quaternion()
q.setFromUnitVectors(f, cameraLookAt)
// interpolate camera position
this.position.lerp(cameraOffset, 0.1)
this.tjsObject.position.copy(this.position)
// interpolate camera rotation
this.tjsObject.quaternion.slerp(q, 0.1)
}
But it works like this now 
But if i slerp to ship 3d object quaternion it works like expected, but without lookAt custom vector unfortunately.
change
this.tjsObject.quaternion.slerp(q, 0.1)
to
this.tjsObject.quaternion.slerp(this.ship.quaternion, 0.1)
but as i say above there is no camera custom lookAt vector now
I think the question is how to make lookAt function without .up vector.I think cameraLookAt vector calculates properly, because with three.js lookAt function it works as expected.
I don’t understand what that means. The up vector defines the object’s roll in the final orientation, so all 3d objects must have one.
Assuming that tjsObject is the camera, I think vector f should be negated, since cameras look out their negative z axes.
Also, cameraLookAt appears to just be a world position; you need a new normalized vector from the camera’s world position to the cameraLookAt world position called cameraLookAtDirection or something and then use that and vector f to calculate the quaternion.
It might help to add a debug orbit camera to your scene with a button to toggle between the cameras so you can drop debug axes helpers to see if your positions and rotations come out like you expect.
Thanks. I’ll try to calculate cameraLookAtDirection and rotate vector