threejs加载glb三维模型文件--解决全黑的问题

展示:

代码:
 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Three.js OrbitControls Example with Grid and GLTF Model</title>
  <style>
    body { margin: 0; overflow: hidden; }
    canvas { display: block; }
  </style>
</head>
<body>
  <script type="module">
    
   

	    import * as THREE from "three";
	    import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
		import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
		
		

    // 创建场景
    const scene = new THREE.Scene();
    
    // 创建相机
    const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
    camera.position.z = 5; // 设置相机位置

    // 创建渲染器
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    // 创建网格
    const gridHelper = new THREE.GridHelper(1000, 10);
    scene.add(gridHelper);

    // 添加一个环境光源
    const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 环境光,增加强度
    scene.add(ambientLight);

    // 添加一个点光源
    const pointLight = new THREE.PointLight(0xffffff, 2, 100); // 强度加大
    pointLight.position.set(5, 5, 5); // 设置点光源位置
    scene.add(pointLight);

    // 使用 OrbitControls 来控制相机
    const controls = new OrbitControls(camera, renderer.domElement);
    controls.enableDamping = true; // 启用阻尼效果
    controls.dampingFactor = 0.25; // 阻尼系数
    controls.screenSpacePanning = false; // 不允许屏幕空间平移

    // 加载 GLTF 模型
    const loader = new GLTFLoader();
    loader.load(
      '../models/zong.glb',  // 模型文件路径
      (gltf) => {
        // 模型加载完成后添加到场景
        scene.add(gltf.scene);
        gltf.scene.scale.set(0.5, 0.5, 0.5); // 可选:缩放模型
        gltf.scene.position.set(0, 0, 0); // 可选:设置模型位置
      },
      (xhr) => {
        console.log((xhr.loaded / xhr.total * 100) + '% loaded'); // 加载进度
      },
      (error) => {
        console.error('Error loading model:', error); // 错误处理
      }
    );

    // 动画循环
    function animate() {
      requestAnimationFrame(animate);

      // 更新控制器
      controls.update();

      // 渲染场景
      renderer.render(scene, camera);
    }

    animate(); // 启动动画

    // 监听窗口大小变化
    window.addEventListener('resize', () => {
      renderer.setSize(window.innerWidth, window.innerHeight);
      camera.aspect = window.innerWidth / window.innerHeight;
      camera.updateProjectionMatrix();
    });
  </script>
</body>
</html>

目录结构:

但是我要中直接展示的效果:如下

解决全黑的问题:加入环境光和方向光(类似太阳光)

代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Three.js GLTF Model with Shadows (No Texture)</title>
  <style>
    body { margin: 0; overflow: hidden; }
    canvas { display: block; }
  </style>
</head>
<body>
  <script type="module">
 
 	    import * as THREE from "three";
 	    import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
 		import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
 		
 		
    // 创建场景
    const scene = new THREE.Scene();
        // 设置场景背景颜色为灰白色
        scene.background = new THREE.Color(0xeeeeee); // 设置为灰白色背景

    // 创建相机
    const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    camera.position.set(10, 10, 20); // 调整相机位置
    camera.lookAt(0, 0, 0); // 确保相机朝向模型

    // 创建渲染器并启用阴影
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.shadowMap.enabled = true; // 启用阴影映射
    document.body.appendChild(renderer.domElement);

    // 创建网格(为了演示阴影效果)
    const gridHelper = new THREE.GridHelper(500, 10);
    scene.add(gridHelper);

    // 添加一个环境光源(增加强度)
    const ambientLight = new THREE.AmbientLight(0xffffff); // 增强环境光强度
    scene.add(ambientLight);
	
	const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
	scene.add( directionalLight );

    // 添加一个点光源,并使其投射阴影
    const pointLight = new THREE.PointLight(0xffffff, 2, 100); // 强度加大
    pointLight.position.set(5, 10, 5); // 设置点光源位置
    pointLight.castShadow = true; // 启用点光源的阴影
    scene.add(pointLight);

    // 配置阴影设置
    pointLight.shadow.mapSize.width = 1024;  // 阴影贴图宽度
    pointLight.shadow.mapSize.height = 1024; // 阴影贴图高度
    pointLight.shadow.camera.near = 0.1;  // 阴影近裁剪面
    pointLight.shadow.camera.far = 25;    // 阴影远裁剪面

    // 使用 OrbitControls 来控制相机
    const controls = new OrbitControls(camera, renderer.domElement);
    controls.enableDamping = true; // 启用阻尼效果
    controls.dampingFactor = 0.25; // 阻尼系数
    controls.screenSpacePanning = false; // 不允许屏幕空间平移

    // 加载 GLTF 模型
    const loader = new GLTFLoader();
    loader.load(
      '../models/zong.glb',  // 模型文件路径
      (gltf) => {
        const model = gltf.scene;
        model.castShadow = true;  // 模型投射阴影
        model.receiveShadow = true;  // 模型接收阴影
        scene.add(model);
      },
      (xhr) => {
        console.log((xhr.loaded / xhr.total * 100) + '% loaded'); // 加载进度
      },
      (error) => {
        console.error('Error loading model:', error); // 错误处理
      }
    );

    // 动画循环
    function animate() {
      requestAnimationFrame(animate);

      // 更新控制器
      controls.update();

      // 渲染场景
      renderer.render(scene, camera);
    }

    animate(); // 启动动画

    // 监听窗口大小变化
    window.addEventListener('resize', () => {
      renderer.setSize(window.innerWidth, window.innerHeight);
      camera.aspect = window.innerWidth / window.innerHeight;
      camera.updateProjectionMatrix();
    });
  </script>
</body>
</html>

### three.js 加载 GLTF 模型出现白模的原因分析 当使用 `three.js` 加载 `.gltf` 或者 `.glb` 文件时,如果遇到模型显示为白色的现象,通常是因为材质未能正确应用。这可能是由于光照设置不当、纹理路径错误或者是材质属性配置有误等原因造成的。 #### 可能原因及解决方案 1. **缺少环境光或光源** 如果场景中没有任何类型的灯光,则即使导入了带有贴图的3D对象也会呈现全黑或者纯白色的外观。因此,在加载GLTF模型前应该先确认已经设置了合适的照明条件[^1]。 2. **UV坐标映射问题** UV未被正确定义也可能导致无法正常展示纹理。不过这种情况较为少见,更多时候是由于其他因素引起。 3. **纹理路径不对** 当`.gltf/.glb`文件中的外部资源(如图片)链接指向不正确的位置时,就会造成找不到对应素材而变成空白色块。确保所有依赖项都放置在同一目录下或是调整好相对路径。 4. **材质参数设定不合理** 对于某些特定情况下,默认生成的基础网格材质(`MeshStandardMaterial`)可能并不适合当前使用的模型结构。此时可以通过修改其内部属性来改善视觉效果,例如增加金属度(metalness)和平滑度(roughness)[^3]。 5. **浏览器兼容性差异** 不同版本浏览器对于WebGL的支持程度有所区别,尤其是在处理复杂图形运算方面表现各异。尝试更新至最新版Chrome/Firefox等主流平台测试是否依旧存在问题。 6. **模型本身携带的Shader代码冲突** 部分特殊格式的三维资产内嵌自定义着色器逻辑,这些额外指令有时会干扰标准渲染流程从而引发异常状况。考虑简化输入源或者转换为目标框架所支持的标准形式再做尝试[^4]。 7. **异步加载顺序混乱** 若存在多个大型资源需同步读取并初始化的话,务必注意它们之间的先后次序以免相互影响最终结果。合理安排脚本执行时机有助于规避此类风险。 8. **跨域资源共享(CORS)策略限制** 从远程服务器获取静态资源时可能会碰到权限验证失败的情形,进而阻止后续操作继续推进下去。查阅官方文档了解如何妥善配置CORS头信息以便顺利访问所需资料。 ```javascript import { useEffect } from 'react'; import * as THREE from 'three'; import { useLoader, Canvas } from '@react-three/fiber'; import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; function Model({ url }) { const gltf = useLoader(GLTFLoader, url); // 添加默认方向光和环境光 useEffect(() => { const light = new THREE.DirectionalLight(0xffffff, 1); light.position.set(5, 5, 5).normalize(); const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // soft white light scene.add(light, ambientLight); }, []); return <primitive object={gltf.scene} />; } export default function App() { return ( <Canvas> <Model url='/path/to/model.gltf'/> </Canvas> ); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值