diff --git a/components/canvas/world3d/World3DViewer.tsx b/components/canvas/world3d/World3DViewer.tsx index b2db8b16b..470bdfdde 100644 --- a/components/canvas/world3d/World3DViewer.tsx +++ b/components/canvas/world3d/World3DViewer.tsx @@ -487,11 +487,21 @@ function positionCameraInsideWorld({ const nearTargetPosition = cameraPosition .clone() .addScaledVector(lookDirection, THREE.MathUtils.clamp(majorSpan * 0.24, 0.75, 2.4)); - nearTargetPosition.y = THREE.MathUtils.clamp( - eyeY - THREE.MathUtils.clamp(size.y * 0.025, 0.04, 0.18), - minEyeY <= maxEyeY ? minEyeY : worldBounds.min.y, - minEyeY <= maxEyeY ? maxEyeY : worldBounds.max.y + const targetDrop = firstPerson + ? THREE.MathUtils.clamp(humanEyeOffset * 0.46 + size.y * 0.035, 0.38, 0.95) + : THREE.MathUtils.clamp(size.y * 0.025, 0.04, 0.18); + const minLookTargetY = Math.max( + worldBounds.min.y + Math.max(size.y * 0.04, 0.08), + estimatedFloorY + 0.05 ); + const maxLookTargetY = + minEyeY <= maxEyeY + ? maxEyeY + : worldBounds.max.y - Math.max(size.y * 0.08, 0.16); + nearTargetPosition.y = + minLookTargetY <= maxLookTargetY + ? THREE.MathUtils.clamp(eyeY - targetDrop, minLookTargetY, maxLookTargetY) + : eyeY - targetDrop; nearTargetPosition.x = clampInsideAxis( nearTargetPosition.x, worldBounds.min.x,