cam update should move target too (#1674)

This commit is contained in:
Kurt Hutten
2024-03-08 18:52:31 +11:00
committed by GitHub
parent 0d1852bbc3
commit 77e9a35c4d

View File

@ -731,6 +731,7 @@ export class CameraControls {
async tweenCameraToQuaternion(
targetQuaternion: Quaternion,
targetPosition = new Vector3(),
duration = 500,
toOrthographic = true
): Promise<void> {
@ -750,12 +751,14 @@ export class CameraControls {
}
await this._tweenCameraToQuaternion(
targetQuaternion,
targetPosition,
remainingDuration,
toOrthographic
)
}
_tweenCameraToQuaternion(
targetQuaternion: Quaternion,
targetPosition: Vector3,
duration = 500,
toOrthographic = false
): Promise<void> {
@ -763,10 +766,11 @@ export class CameraControls {
const camera = this.camera
this._isCamMovingCallback(true, true)
const initialQuaternion = camera.quaternion.clone()
const initialTarget = this.target.clone()
const isVertical = isQuaternionVertical(targetQuaternion)
let tweenEnd = isVertical ? 0.99 : 1
const controlsTarget = this.target.clone()
const initialDistance = controlsTarget.distanceTo(camera.position.clone())
const tempVec = new Vector3()
const initialDistance = initialTarget.distanceTo(camera.position.clone())
const cameraAtTime = (animationProgress: number /* 0 - 1 */) => {
const currentQ = tempQuaternion.slerpQuaternions(
@ -774,6 +778,11 @@ export class CameraControls {
targetQuaternion,
animationProgress
)
const currentTarget = tempVec.lerpVectors(
initialTarget,
targetPosition,
animationProgress
)
if (this.camera instanceof PerspectiveCamera)
// changing the camera position back when it's orthographic doesn't do anything
// and it messes up animating back to perspective later
@ -781,12 +790,11 @@ export class CameraControls {
.set(0, 0, 1)
.applyQuaternion(currentQ)
.multiplyScalar(initialDistance)
.add(controlsTarget)
.add(currentTarget)
this.camera.up.set(0, 1, 0).applyQuaternion(currentQ).normalize()
this.camera.quaternion.copy(currentQ)
this.target.copy(controlsTarget)
// this.controls.update()
this.target.copy(currentTarget)
this.camera.updateProjectionMatrix()
this.update()
this.onCameraChange()