-
+
@@ -113,9 +113,6 @@ const delivery = computed(() =>
>
@@ -140,9 +137,6 @@ const delivery = computed(() =>
>
diff --git a/utils/calculateScaleToFit.ts b/utils/calculateScaleToFit.ts
new file mode 100644
index 0000000..09069fa
--- /dev/null
+++ b/utils/calculateScaleToFit.ts
@@ -0,0 +1,57 @@
+import { Box3, PerspectiveCamera, Vector3 } from 'three'
+import { degToRad } from 'three/src/math/MathUtils.js';
+
+/**
+ * Вычисляет масштаб объекта и позицию камеры, чтобы объект полностью помещался в видимой области.
+ * @param object - Объект Three.js (например, загруженная модель).
+ * @param camera - Экземпляр камеры.
+ * @param controls - Экземпляр OrbitControls.
+ * @param distance - Расстояние от камеры до объекта.
+ * @param cameraOffset - Коэффициенты смещения камеры (x, y, z).
+ */
+export default function (
+ object: any,
+ camera: PerspectiveCamera,
+ controls: any,
+ distance: number,
+ cameraOffset: { x: number; y: number; z: number }
+) {
+ // Обновляем мировую матрицу объекта
+ object.updateWorldMatrix(true, true)
+
+ const fov = camera.fov // Угол обзора камеры
+ const aspect = camera.aspect // Соотношение сторон
+
+ const bbox = new Box3().setFromObject(object) // Вычисляем bounding box
+ const center = new Vector3()
+ bbox.getCenter(center) // Центр объекта
+
+ const size = new Vector3()
+ bbox.getSize(size) // Размеры объекта
+
+ // Рассчитываем масштаб, чтобы объект полностью помещался в видимой области
+ const vFOV = degToRad(fov) // Угол обзора в радианах
+ const visibleHeight = 2 * Math.tan(vFOV / 2) * distance // Видимая высота
+ const visibleWidth = visibleHeight * aspect // Видимая ширина
+
+ const scaleX = visibleWidth / size.x
+ const scaleY = visibleHeight / size.y
+ const scaleZ = visibleWidth / size.z
+
+ const scale = Math.min(scaleX, scaleY, scaleZ)
+
+ // Позиционируем камеру с учетом смещения
+ camera.position.set(
+ center.x + distance * cameraOffset.x,
+ center.y + distance * cameraOffset.y,
+ center.z + distance * cameraOffset.z
+ )
+
+ // Устанавливаем цель для OrbitControls
+ if (controls) {
+ controls.target.set(center.x, center.y, center.z)
+ controls.update() // Обновляем контроллы
+ }
+
+ return { scale, center }
+}
\ No newline at end of file