使用 React Three Fiber 实现 X 轴上的相机旋转

问题描述 投票:0回答:1

我只想设置我的相机 X 角度视图以从上方查看我的场景。

这是我的起始代码:

          <PerspectiveCamera
            makeDefault
            rotation={[0, 4.7, 0]}
            position={[-20, 7, 0]}
            fov={60}
            near={1}
            far={100}
          />
          <PerspectiveCamera
            ref={cameraRef}
            rotation={[0, 4.7, 0]}
            position={[-20, 7, 0]}
            fov={50}
            near={1}
            far={100}
          />

enter image description here

我正在更改 x 轴旋转值,但似乎它会影响 y 轴旋转...

      <PerspectiveCamera
        makeDefault
        rotation={[0, 4.7, 0]}
        position={[-20, 7, 0]}
        fov={60}
        near={1}
        far={100}
      />
      <PerspectiveCamera
        ref={cameraRef}
        rotation={[1, 4.7, 0]}  // HERE IS WHAT I CHANGED !
        position={[-20, 7, 0]}
        fov={50}
        near={1}
        far={100}
      />

如果我改变 x 轴旋转,结果就是......奇怪?

enter image description here

我想设置我的相机从上到下观察,类似这样的:

enter image description here

如果我只是更改 x 轴旋转,那么结果就是我正在寻找的 x 旋转:

          <PerspectiveCamera
        makeDefault 
        rotation={[0, 4.7, 0]}
        position={[-20, 7, 0]} 
        fov={60} 
        near={1}
        far={100}
      />
      <PerspectiveCamera
        ref={cameraRef} 
        rotation={[-0.5, 0, 0]}
        position={[-20, 7, 0]} 
        fov={50} 
        near={1}
        far={100}
      />

enter image description here

感谢您的帮助。

这是完整的代码:

import { Canvas } from '@react-three/fiber';
import React, { Suspense, useRef } from 'react';
import SoccerField from '../models/SoccerField.jsx';
import SoccerBall from '../models/SoccerBall.jsx';
import {
CameraControls,
MeshReflectorMaterial,
PerspectiveCamera,
useHelper
} from '@react-three/drei';
import { degToRad } from 'maath/misc';
import Trophy from '../models/Trophy.jsx';
import SoccerStadium from '../models/SoccerStadium.jsx';
import { AxesHelper, CameraHelper } from 'three';

const SoccerScene = () => {
const controls = useRef();
const directionalLightRef = useRef();
console.log(directionalLightRef);

const cameraRef = useRef();
console.log(cameraRef);
return (
<section className="w-full h-screen relative bg-[#dfd6c6]">
  <Canvas
    className={`w-full h-screen bg-transparent`}
    shadows
  >
    {cameraRef.current && <primitive object={new 
CameraHelper(cameraRef.current)} />}

    <Suspense fallback={null}>
      <primitive object={new AxesHelper(5)} />

      <directionalLight
        ref={directionalLightRef}
        position={[60, 100, 100]}
        rotation={[0, 0, 0]}
        intensity={2}
        castShadow
        shadow-mapSize-width={4096 * 2} // Augmente la résolution de l'ombre
        shadow-mapSize-height={4096 * 2} // Augmente la résolution de l'ombre
        shadow-camera-left={-50} // Augmente la largeur de la caméra d'ombre
        shadow-camera-right={50} // Augmente la largeur de la caméra d'ombre
        shadow-camera-top={10} // Augmente la hauteur de la caméra d'ombre
        shadow-camera-bottom={-10}
      />
      {/*{directionalLightRef.current && (*/}
      {/*  <cameraHelper args={[directionalLightRef.current.shadow.camera]} />*/}
      {/*)}*/}
      <ambientLight intensity={0.5} />
      <pointLight
        position={[10, 5, 10]}
        intensity={2}
      />
      <spotLight
        position={[0, 50, 10]}
        angle={0.15}
        penumbra={1}
        intensity={2}
      />
      <hemisphereLight
        skyColor="#b1e1ff"
        groundColor="#000000"
        intensity={1}
      />

      {/* Caméra principale avec ref */}
      <PerspectiveCamera
        makeDefault // Cela définira cette caméra comme la caméra par défaut
        rotation={[0, 4.7, 0]}
        position={[-20, 7, 0]} // Position de la caméra pour ajuster l'angle
        fov={60} // Vous pouvez ajuster le champ de vision pour changer l'angle
        near={1}
        far={100}
      />
      <PerspectiveCamera
        ref={cameraRef} // Attachement de la ref ici
        rotation={[0, 4.7, 0]}
        position={[-20, 7, 0]} // Position de la caméra pour ajuster l'angle
        fov={50} // Vous pouvez ajuster le champ de vision pour changer l'angle
        near={1}
        far={100}
      />
      {/* Utilisation du CameraHelper */}
      {cameraRef.current && <primitive object={new CameraHelper(cameraRef.current)} />}

      <CameraControls
        ref={controls}
        // minPolarAngle={degToRad(20)}
        // maxPolarAngle={degToRad(90)}
      />
      <SoccerStadium
        scale={0.1}
        position={[10, 0, 0]}
      />
      <group
        castShadow
        receiveShadow
        position={[-5, 4.3, -3]}
      >
        <Trophy
          scale={3}
          position={[10, 0, 2]}
        />
        <SoccerBall
          position={[5, -1, 2]}
          scale={0.5}
        />
      </group>
    </Suspense>
  </Canvas>
</section>
);
};

export default SoccerScene;
three.js camera react-three-fiber
1个回答
0
投票

我不熟悉react-3语法。但我可以尽力帮助你找到解决问题的方向。为了让相机从上方观察物体,您需要通过物体上方的“position.y”设置其高度。并将相机目标(即相机所看的地方)设置为物体。为此,相机目标矢量必须与对象矢量的位置相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.