diff --git a/packages/core/src/math/copySign.ts b/packages/core/src/math/copySign.ts new file mode 100644 index 000000000..4879dd408 --- /dev/null +++ b/packages/core/src/math/copySign.ts @@ -0,0 +1,3 @@ +export function copySign(a: number, b: number) { + return b >= 0 ? Math.abs(a) : -Math.abs(a); +} diff --git a/packages/website-ue/src/components/TankopediaControls.tsx b/packages/website-ue/src/components/TankopediaControls.tsx index b27a3087b..fa5f58acb 100644 --- a/packages/website-ue/src/components/TankopediaControls.tsx +++ b/packages/website-ue/src/components/TankopediaControls.tsx @@ -3,6 +3,7 @@ import { invalidate, useFrame, useThree } from "@react-three/fiber"; import { useCallback, useEffect, useRef, type RefObject } from "react"; import { Quaternion, Vector2, Vector3 } from "three"; import { + cameraCenterCorrectionAmplitude, cameraSwingHorizontalAmplitude, cameraSwingHorizontalFrequency, cameraSwingVerticalAmplitude, @@ -32,6 +33,12 @@ export function TankopediaControls() { const disturbed = Tankopedia.use((state) => state.disturbed); const updateCameraPosition = useCallback(() => { + // https://www.desmos.com/calculator/wen5z8qdc1 + cameraCenter.x = + cameraCenterCorrectionAmplitude * + Math.sin(2 * theta.current) * + Math.sign(Math.cos(theta.current)); + workingVector3 .set( Math.sin(phi.current) * Math.sin(theta.current), diff --git a/packages/website-ue/src/config/camera.ts b/packages/website-ue/src/config/camera.ts index c83e65b68..8df5e237a 100644 --- a/packages/website-ue/src/config/camera.ts +++ b/packages/website-ue/src/config/camera.ts @@ -10,3 +10,5 @@ export const cameraSwingVerticalAmplitude = degToRad(5); export const cameraSwingVerticalFrequency = Math.E ** -6; export const cameraSwingHorizontalAmplitude = degToRad(30); export const cameraSwingHorizontalFrequency = Math.E ** -5; + +export const cameraCenterCorrectionAmplitude = 0.8;