reactjs 如何将鼠标事件添加到React-Three-Fiber中Rhino 3dm文件加载的每个网格部件?

qv7cva1a  于 2023-02-18  发布在  React
关注(0)|答案(1)|浏览(124)

我想实现一个函数,当鼠标停留在从react-three-fiber文件加载的每个网格部分上时,改变颜色。但是在下面的代码中,由于某种原因,鼠标事件不能正常工作。
对于GLTF,使用Object.values(gltf.nodes).map效果很好。enter image description here
对于Rhino3dm,我使用object.children.map,我认为这很糟糕。
你知道原因和解决办法吗?
这是沙盒URL。https://codesandbox.io/s/test-rhino3dmloader-wnrty6?file=/src/App.js

import "./styles.css";
import * as THREE from "three";
import { useEffect, useMemo, useRef, useState } from "react";
import { Canvas } from "@react-three/fiber";
import { useLoader } from "@react-three/fiber";
import { Rhino3dmLoader } from "three/examples/jsm/loaders/3DMLoader";
import { Environment, OrbitControls} from "@react-three/drei";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { Suspense } from "react";

const Part = (child) => {
  const objRef = useRef();
  const [hovered, setHover] = useState(false);
  const material = new THREE.MeshStandardMaterial({
    color: hovered ? "hotpink" : "orange"
  });
  return (
    <mesh
      key={child.id}
      ref={objRef}
      castShadow
      receiveShadow
      onPointerOver={(e) => {
        e.stopPropagation();
        setHover(true);
      }}
      onPointerOut={(e) => {
        e.stopPropagation();
        setHover(false);
      }}
    >
      <primitive object={child} material={material} />
    </mesh>
  );
};

const Model = () => {
  // For some reason mouse events don't work well in Rhino3dm.
  const object = useLoader(Rhino3dmLoader, "./rhino_logo.3dm", (loader) => {
    loader.setLibraryPath("https://cdn.jsdelivr.net/npm/rhino3dm@0.15.0-beta/");
  });
  
  const model = object.children.map((child) => Part(child));

  // For gltf the below code worked fine.
  /* 
  const gltf = useLoader(GLTFLoader, "./rhino_logo.glb");
  const model = Object.values(gltf.nodes).map((child) => {
    if(child.isMesh){
     return Part(child)
    }
  });
  */
  return model;
};

export default function App() {
  return (
    <div className="App">
      <Canvas>
        <Suspense fallback={null}>
          <Model />
          <OrbitControls />
          <Environment preset="sunset" background />
        </Suspense>
      </Canvas>
    </div>
  );
}

相关问题