jank: jankify the camera locking code so that it stays behind the robot properly
This commit is contained in:
parent
6c9e3b2491
commit
493a81b954
1 changed files with 45 additions and 3 deletions
|
@ -87,9 +87,9 @@
|
||||||
object as unknown as { x: number; y: number; z: number }
|
object as unknown as { x: number; y: number; z: number }
|
||||||
)
|
)
|
||||||
|
|
||||||
const horizontalOffsetDistance = 12 // Distance behind the leading vector
|
const horizontalOffsetDistance = 15 // Distance behind the leading vector
|
||||||
const direction = new Vector3(0, 0, 1) // Default forward direction in Three.js is negative z-axis, so behind is positive z-axis
|
const direction = new Vector3(0, 0, 1) // Default forward direction in Three.js is negative z-axis, so behind is positive z-axis
|
||||||
const verticalOffset = new Vector3(0, -2.8, 0)
|
const verticalOffset = new Vector3(0, -5, 0)
|
||||||
|
|
||||||
// Calculate the offset vector
|
// Calculate the offset vector
|
||||||
const offsetVector = direction
|
const offsetVector = direction
|
||||||
|
@ -100,14 +100,56 @@
|
||||||
// If the leading object is rotating, apply its rotation to the offset vector
|
// If the leading object is rotating, apply its rotation to the offset vector
|
||||||
const rotatedOffsetVector = offsetVector.applyQuaternion(object.quaternion)
|
const rotatedOffsetVector = offsetVector.applyQuaternion(object.quaternion)
|
||||||
|
|
||||||
|
const leftOffset = -1.5
|
||||||
|
function shiftVectorLeft(
|
||||||
|
vector: Vector3,
|
||||||
|
amount: number,
|
||||||
|
upDirection = axis
|
||||||
|
): void {
|
||||||
|
// Calculate the left direction. Assuming 'up' is the global up direction or a custom up vector.
|
||||||
|
// This creates a vector pointing to the "left" of the original vector, in a 3D context.
|
||||||
|
let leftDirection = new Vector3()
|
||||||
|
.crossVectors(upDirection, vector)
|
||||||
|
.normalize()
|
||||||
|
|
||||||
|
// Scale the left direction by the desired amount
|
||||||
|
leftDirection.multiplyScalar(amount)
|
||||||
|
|
||||||
|
// Add the scaled left direction to the original vector, mutating it
|
||||||
|
vector.add(leftDirection)
|
||||||
|
}
|
||||||
|
|
||||||
|
shiftVectorLeft(rotatedOffsetVector, leftOffset)
|
||||||
|
|
||||||
// Calculate the trailing vector's position
|
// Calculate the trailing vector's position
|
||||||
const trailingVector = robotPosition.clone().sub(rotatedOffsetVector)
|
const trailingVector = robotPosition.clone().sub(rotatedOffsetVector)
|
||||||
|
|
||||||
|
function shiftVectorLeftNonMutate(
|
||||||
|
vector: Vector3,
|
||||||
|
amount: number,
|
||||||
|
upDirection = axis
|
||||||
|
): Vector3 {
|
||||||
|
// Create a new vector to avoid mutating the original vector
|
||||||
|
let shiftedVector = vector.clone()
|
||||||
|
|
||||||
|
// Calculate the left direction. Assuming 'up' is the global up direction or a custom up vector.
|
||||||
|
// This creates a vector pointing to the "left" of the original vector, in a 3D context.
|
||||||
|
let leftDirection = new Vector3()
|
||||||
|
.crossVectors(upDirection, vector)
|
||||||
|
.normalize()
|
||||||
|
|
||||||
|
// Scale the left direction by the desired amount and add it to the original vector
|
||||||
|
leftDirection.multiplyScalar(amount)
|
||||||
|
shiftedVector.add(leftDirection)
|
||||||
|
|
||||||
|
return shiftedVector
|
||||||
|
}
|
||||||
|
|
||||||
if (!shouldOrbit) {
|
if (!shouldOrbit) {
|
||||||
// then finally set the camera, a bit behind the model
|
// then finally set the camera, a bit behind the model
|
||||||
$camera!.position.copy(trailingVector)
|
$camera!.position.copy(trailingVector)
|
||||||
// Rotate the offset around the Y-axis
|
// Rotate the offset around the Y-axis
|
||||||
$camera!.lookAt(currentLookAt)
|
$camera!.lookAt(shiftVectorLeftNonMutate(currentLookAt, -leftOffset))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue