You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React Three Fiber中获取Scene对象的引用?

在React Three Fiber中获取Scene对象并使用scene.add()

要在React Three Fiber(R3F)里拿到Three.js的scene对象,别用<Canvas>的ref——它指向的是DOM层面的canvas元素,不是Three.js的Scene实例,这就是你之前拿不到的原因。

正确的做法是用R3F提供的useThree钩子,它能直接获取当前场景的核心对象(scene、camera、gl等):

import { Canvas, useThree } from '@react-three/fiber';
import * as THREE from 'three';
import { useEffect } from 'react';

function MyCustomComponent() {
  // 从useThree中解构出scene
  const { scene } = useThree();

  // 组件挂载时添加自定义Three对象
  useEffect(() => {
    // 示例:创建一个立方体
    const geometry = new THREE.BoxBufferGeometry(1, 1, 1);
    const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
    const cube = new THREE.Mesh(geometry, material);
    
    // 用传统方式添加到scene
    scene.add(cube);

    // 组件卸载时清理资源
    return () => {
      scene.remove(cube);
      geometry.dispose();
      material.dispose();
    };
  }, [scene]);

  return null; // 该组件无需渲染JSX元素
}

// 主组件中使用
function App() {
  return (
    <Canvas>
      <MyCustomComponent />
      {/* 其他R3F组件或原生Three对象 */}
    </Canvas>
  );
}

如果要在子组件里获取scene,直接在子组件内调用useThree即可,不需要传递任何ref——R3F会通过上下文自动传递这些核心对象。

另外关于你提到的Geometry转BufferGeometry的问题,简单说明:原来的Geometry.vertices可以用BufferGeometry.setFromPoints()替代,把顶点数组转成THREE.Vector3数组后传入该方法,就能生成对应的BufferGeometry。

内容的提问来源于stack exchange,提问作者timhc22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:40:20