Холст Threejs не уменьшается при повороте телефона назад

Я использую три библиотеки js, когда я поворачиваю свой телефон, мой компонент в основном увеличивает его размер, но когда я переворачиваю телефон назад, он не меняется обратно, это искажает мою страницу, и половина компонента выходит за пределы страницы, как это сделать отзывчивый?

import * as THREE from "three";
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
import { useEffect, useRef } from "react";


export default function THREE_scene({container}) {
  const sizes = {
    width:window.innerWidth,
    height: 700,
  };

  const canvas = useRef(null);
  const scene = new THREE.Scene();
  const loader = new GLTFLoader();
  const camera = new THREE.PerspectiveCamera(45, sizes.width / sizes.height);
  var renderer;

  camera.position.set(35.6, 37.8, -24.5);
  camera.lookAt(-2.28, 0.75, 2.47);

  const light = new THREE.PointLight("#FFFFFF", 1000, 100);
  light.position.set(20, 28, -10);
  scene.add(light);
  scene.add(camera);
  scene.background = new THREE.Color("#000000");

  function init() {
    renderer = new THREE.WebGLRenderer({ canvas: canvas.current });
    
    renderer.setSize(sizes.width, sizes.height);
    camera.updateProjectionMatrix();
    camera.aspect = sizes.width / sizes.height;
  }

  loader.load("./globe.glb", (gtlf) => {
    scene.add(gtlf.scene);

   
    renderer.setAnimationLoop(animate);
  });

  function animate(timestamp) {
    renderer.setSize(sizes.width, sizes.height);
    renderer.render(scene, camera);
    scene.children[2].children[0].rotation.y = timestamp / 10000;
    
  }



  window.addEventListener("resize", () => {
    init()
    canvas.current.width = window.innerWidth;
    canvas.current.height=window.innerHeight
    sizes.width = window.innerWidth;
    camera.aspect = sizes.width / sizes.height;
   
    
    renderer.setSize(sizes.width, sizes.height);
    camera.updateProjectionMatrix();

    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
    renderer.render(camera,scene)
    
    
  });

  useEffect(() => {
    init();
   
  });

  return (
    <div>
      <canvas id = "webgl"  ref = {canvas}></canvas>
    </div>
  );
}

Холст Threejs не уменьшается при повороте телефона назадвведите сюда описание изображения .................................................. .....

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте добавить эту функцию и хук эффекта. И настоятельно рекомендуется использовать в вашем сценарии R3F. Хотя бы потому, что в вашем случае Canvas там изначально адаптивный.

function respCanvas() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
}

useEffect(() => {
    init();
    window.addEventListener("resize", respCanvas);

    return () => {
        window.removeEventListener("resize", respCanvas);
    };
}, []);

ОБНОВЛЕНИЕ 0

Я подозревал, что вы это имели в виду… и это создает довольно большую головную боль, когда у вас много объектов на холсте. Если это один, то это не имеет большого значения, но если у вас их много, ну, в любом случае.

В этом сценарии масштабирование холста будет определять реакцию внутри этого холста.

Итак, вам придется отдельно настраивать холст и объекты, в вашем случае глобус.

Вы можете сделать это в ванили, а также в GSAP, чтобы слушать изменение размера.

И в этом случае R3F вам тоже не поможет, все равно лучше его использовать, но там изначально отзывчивый Canvas, а не объекты.

let model;
let landscapeScale = 15;
let portraitScale = 2;

//…

function resizeModel() {
    if (window.innerWidth > window.innerHeight) {
      model.scale.set(landscapeScale, landscapeScale, landscapeScale);
    } else {
      model.scale.set(portraitScale, portraitScale, portraitScale);
    }
  }

  useEffect(() => {
init();
window.addEventListener("resize", () => {
  resizeCanvas();
  resizeModel();
});
window.addEventListener("orientationchange", () => {
  resizeModel();
});
return () => {
  window.removeEventListener("resize", resizeCanvas);
  window.removeEventListener("orientationchange", resizeModel);
};
}, []);

https://codepen.io/Lucas_Mas/full/BaeZYxO

Сейчас то же самое, но объект стал более плоским

Takeshi Szentagothai 06.06.2024 14:59

@TakeshiSzentagothai Ммм, что значит «льстить»? Я подозреваю, что вы имеете в виду. Однако можете ли вы создать CodePen для решения этой проблемы?

Łukasz D. Mastalerz 06.06.2024 15:07

Не могу развернуть реакцию на codepen. Вместо этого у меня есть это. Хотя здесь не описана «плоская» проблема, но это демонстрирует мою проблему, если вы используете телефон и переворачиваете его. dml199.github.io/fin_adv

Takeshi Szentagothai 06.06.2024 20:14

Я прикрепил файл с проблемой под изображением.

Takeshi Szentagothai 06.06.2024 20:20

@TakeshiSzentagothai По моему мнению, приложение по вашей ссылке работает именно так, как должно… Вы говорите о глобусе, потому что он не подходит к портрету?

Łukasz D. Mastalerz 06.06.2024 21:24

Да, когда я поворачиваю холст телефона, масштабируется, чтобы соответствовать размеру, когда я поворачиваюсь назад, он не масштабируется, а только компоненты страницы, поэтому он выходит за пределы размера страницы.

Takeshi Szentagothai 07.06.2024 08:23

Другие вопросы по теме

Похожие вопросы

Как добавить объект JSON внутри тега сценария в NextJS
Анимация навигации с помощью Framer Motion
Как визуализировать сноски с отсутствующими определениями, используя реакции-уценку и примечание-gfm
Css работает локально, но не применяется после запуска «npm run build» в сборке в приложении реагирования
Правильный способ повторить тестовую логику в Cypress с динамическим повторным рендерингом DOM
Django, React, Axios возвращают html вместо данных json
Как предварительно настроить базовую анимацию движения кадра в полиморфном компоненте, использующем слот Radix?
Почему PWA на основе реагирования, размещенное в моей службе приложений Azure, случайно начинает возвращать ошибку 500 для ВСЕХ вызовов POST (GET работает нормально)? Исправлено: Перезапустить браузер?
Не могу найти способ сделать условные реквизиты
Есть ли способ визуализировать HTML из строки в React без использования dangerouslySetInnerHTML или пакета React HTML Parser?