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

React集成Three.js后Canvas无法显示模型紧急求助

React + Three.js 渲染OBJ模型黑屏问题求助

我使用React结合Three.js在网站上渲染OBJ模型作为装饰,模型加载正常(控制台输出“loaded Material”),但页面仅显示默认黑屏,已添加PointLight但无效果。查阅大量同类问题并尝试多种代码修复仍未解决,明日需提交项目,恳请帮助。

怀疑的原因

  • 渲染器因某些原因未更新
  • 相机未对准物体
  • 材质未应用或光照不足无法被看见

预期与实际效果

  • 预期:能看到球体和从Blender导入的模型
  • 实际:仅显示Three.js默认的黑色背景

代码示例

import { useState } from 'react'
import * as THREE from "three";
import { Canvas, useLoader} from '@react-three/fiber'
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader';
import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

import './3dhuman.css'

var scene;
function Human() {

  const scene = new THREE.Scene();
  
  const camera = new THREE.PerspectiveCamera(50, width / height, 1, 10000)
  camera.position.set(0, 10, 0);
  const renderer = new THREE.WebGLRenderer({ antialias: true})
  renderer.setPixelRatio(window.devicePixelRatio);
  
  const controls = new OrbitControls( camera, renderer.domElement );
  var width = 400;
  var height = 500;
  renderer.setSize(width, height)
  var pointlight;

  pointlight = new THREE.PointLight(0xffffff, 1);

  pointlight.position.set(0, 0, 10);

  scene.add(pointlight);

  let ballGeo = new THREE.SphereGeometry(100, 64, 64);

   let ballMat = new THREE.MeshPhysicalMaterial();

  let ballMesh = new THREE.Mesh(ballGeo, ballMat);

  scene.add(ballMesh);
  window.onload = function() {
    document.getElementById('three').appendChild(renderer.domElement)
  };
  
  var mtlLoader = new MTLLoader();

  // load material
  mtlLoader.load("./m.mtl", function(materials) {
    materials.preload();
    console.log("loaded Material");

      // load Object
    var objLoader = new OBJLoader();
    objLoader.setMaterials(materials);
    objLoader.load(
      "./s.obj",
      function(object) {
        scene.add(object);
        object.position.set(0,0,0);
        camera.lookAt(object.position);
        console.log(object.position)
        console.log(camera.position)
        renderer.render(scene,camera);
      })});
      
    function animate() {

        requestAnimationFrame( animate );
      
        // required if controls.enableDamping or controls.autoRotate are set to true
        
      
        renderer.render(scene,camera );
        
      
    }
    animate();
    controls.update();
  return (
    <div className="human">
      <div className='background-human'>
        <div className='links'>
          <a href="3d-elements">Home</a>
          <a href="about-us">About us</a>
          <a href="contact-page">contact us</a>
          <a href="your info">Account</a>
        </div>
        <h1>welcome to<span style={{color: 'red', fontSize: '80px'}}>wx</span>developers</h1>
        <h3>We design your sites with our amazign technologies<br></br>and help you reach for more.</h3>
        <div className='canvas-area' id='three'>
          
        </div>
      </div>
    </div>
  )
}

export default Human

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:02:55