Вопрос или проблема
Привет, у меня есть модель react three fiber, которую я получил с sketchfab. Я установил управление орбитой, но положение объекта/моделей не фиксированное, и каждый раз, когда я пытаюсь прокрутить, оно автоматически зумирует, и я не могу прокрутить вниз. У тебя есть какое-нибудь решение для этого?
import { Canvas } from "@react-three/fiber"
import Models from "../components/Models"
import { Suspense } from "react"
import CanvasLoader from "../components/CanvasLoader"
import { OrbitControls, PerspectiveCamera } from "@react-three/drei"
import { Stage } from "@react-three/drei"
const Hero = () => {
return (
<section className="min-h-screen w-full flex
flex-col relative">
<div className="w-full mx-auto flex
flex-col sm:mt-36 mt-20 c-space gap-3">
<p className="sm:text-3xl text-2xl font-medium
text-white text-center font-generalsans">
Привет, я ------
<span className="waving-hand ">
🤓
</span>
</p>
<p className="hero_tag text-gray_gradient">
Фулстек разработчик
</p>
</div>
//CANVAS DIV
enter image description here
</section>
)
}
export default Hero
Я хочу отключить авто зум и зафиксировать позицию моделей в центре.
<div className=" flex justify-center items-center absolute
inset-0">
<Canvas className="w-1/2 h-1/2 ">
<Stage preset={"rembrandt"} intensity={1} environment={"sunset"}>
/* Мое первое решение вообще не сработало*/
<OrbitControls enableZoom={false}/>
<Suspense fallback={<CanvasLoader />}>
<PerspectiveCamera makeDefault position={[0,0,100]}/>
<Models scale={3} position={[0,-5,0]}/>
<ambientLight intensity={1} />
<directionalLight position={[100,0,10]} intensity={2}/>
</Suspense>
</Stage>
</Canvas>
</div>
Я уже пробовал установить ‘enableZoom’ на false, но здесь перед прокруткой это все равно не сработало.
То, что вы испытываете, имеет небольшое отношение к OrbitControls
, CameraControls
и т.д. как таковым. Если вы отключите зум, все будет работать нормально… вы просто не зумируете, и камера не реагирует на событие. Все сводится к топографии вашего макета. Имейте в виду, что Canvas
является частью вашего HTML
, и, как и другие секции в вашем DOM
, он подчиняется тем же правилам. Существует несколько подходов к этой теме, и каждый из них зависит от того, как Canvas
должен вести себя. В полноразмерных опытах Canvas
обычно заполняет область просмотра, и все движения происходят внутри. В других случаях Canvas
является частью макета, и это то, чем вы, похоже, и пытаетесь заняться. Вы можете добиться этого, заключив Canvas
и CSS
в обертку.
JSX
export default function App() {
return (
<div className="app-container">
{/* Секция перед Canvas */}
<div className="scrollable-stuff">
<h1>aaaaaaaaaaaaaaaaaaaaaaaaaa</h1>
<p>bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb</p>
<p>ccccccccccccccccccccccccccccccccccccccccccccc</p>
<p>dddddddddddddddddddddddddddd</p>
<p>eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</p>
</div>
{/* Three/R3F Canvas */}
<div className="canvas-container">
<Canvas>
<color attach="background" args={["black"]} />
<OrbitControls
enableZoom={false}
enablePan={false}
maxDistance={0.01}
enableDamping={true}
/>
<Box position={[0, 0, -2]}>
<meshBasicMaterial color="red" />
</Box>
</Canvas>
</div>
{/* Секция после Canvas */}
<div className="scrollable-stuff">
<p>fffffffffffffffffffffffffffffffffffffffffff</p>
<p>gggggggggggggggggggggggggggggggggggggggggg</p>
<p>hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh</p>
</div>
</div>
);
}
CSS
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
font-family: Arial, sans-serif;
}
.app-container {
display: flex;
flex-direction: column;
width: 100%;
}
.scrollable-stuff {
padding: 20px;
background-color: #f0f0f0;
}
.scrollable-stuff h1 {
margin-bottom: 16px;
}
.scrollable-stuff p {
margin: 8px 0;
}
.canvas-container {
height: 500px;
width: 100%;
overflow: hidden;
}
canvas {
display: block;
width: 100%;
height: 100%;
}
.
Ответ или решение
Для реализации фиксированной позиции модели и отключения автоматического зума в React Three Fiber с использованием OrbitControls
, необходимо внести несколько изменений в ваш код. Ниже приведены пошаговые инструкции и примеры кода, которые помогут вам решить данную задачу.
Шаги для решения:
-
Отключение зума: Убедитесь, что у вас установлен параметр
enableZoom
вOrbitControls
какfalse
. Это предотвращает зум при прокрутке колеса мыши. -
Фиксация позиции по центру: Для того чтобы модель оставалась в центре сцены, необходимо корректно установить позицию камеры и моделей в сцене. Важно, чтобы положение камеры и объекта совпадало с координатами центра сцены.
-
Ограничение перемещения: Если вы хотите зафиксировать положение моделей и предотвратить их движение, отключите перемещение с помощью
enablePan
.
Пример кода с данными изменениями:
import { Canvas } from "@react-three/fiber";
import Models from "../components/Models";
import { Suspense } from "react";
import CanvasLoader from "../components/CanvasLoader";
import { OrbitControls, PerspectiveCamera, Stage } from "@react-three/drei";
const Hero = () => {
return (
<section className="min-h-screen w-full flex flex-col relative">
<div className="w-full mx-auto flex flex-col sm:mt-36 mt-20 c-space gap-3">
<p className="sm:text-3xl text-2xl font-medium text-white text-center font-generalsans">
Привет, я ------
<span className="waving-hand">🤓</span>
</p>
<p className="hero_tag text-gray_gradient">
Полностековый разработчик
</p>
</div>
{/* CANVAS DIV */}
<div className="flex justify-center items-center absolute inset-0">
<Canvas className="w-1/2 h-1/2">
<Stage preset={"rembrandt"} intensity={1} environment={"sunset"}>
{/* Отключается зум и панорамирование */}
<OrbitControls enableZoom={false} enablePan={false} />
<Suspense fallback={<CanvasLoader />}>
{/* Установка позиции камеры */}
<PerspectiveCamera makeDefault position={[0, 0, 100]} />
{/* Установка модели в центр */}
<Models scale={3} position={[0, -5, 0]} />
<ambientLight intensity={1} />
<directionalLight position={[100, 0, 10]} intensity={2} />
</Suspense>
</Stage>
</Canvas>
</div>
</section>
);
}
export default Hero;
Дополнительные рекомендации:
-
CSS-стили: Убедитесь, что контейнер
Canvas
имеет заданные размеры и правильно отображается в родительском элементе, чтобы обеспечить хорошее взаимодействие с элементами интерфейса. -
Отладка: Если поведение по-прежнему осуществляется не так, как ожидалось, проверьте другие элементы управления, которые могут воздействовать на положение моделей и камеры.
Заключение:
С помощью указанных выше шагов и образца кода вы сможете зафиксировать положение модели в центре и отключить автоматическое зумирование в вашем проекте на React Three Fiber. Подходите к задаче с учетом всех нюансов интерфейса и взаимодействий, чтобы обеспечить удобство пользователям. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.