threejs

1.场景清空,释放内容

// 假设你已经有一个Three.js的场景对象scene
 
// 函数:清空场景中的所有对象
function clearScene(scene) {
    while(scene.children.length > 0){
        const object = scene.children[0];
        
        if(object.isMesh) {
            // 如果有几何体和材质,也进行清理
            object.geometry.dispose();
            if(object.material.isMaterial) {
                cleanMaterial(object.material);
            } else {
                // 材质组是数组,所以我们需要遍历它
                for(const material of object.material) cleanMaterial(material);
            }
        }
        
        scene.remove(object);  // 从场景中移除对象
    }
}
 
// 辅助函数:清理材质资源
function cleanMaterial(material){
    material.dispose(); // 清理材质
    if(material.map) material.map.dispose(); // 清理贴图
    if(material.lightMap) material.lightMap.dispose();
    if(material.bumpMap) material.bumpMap.dispose();
    if(material.normalMap) material.normalMap.dispose();
    if(material.specularMap) material.specularMap.dispose();
    if(material.envMap) material.envMap.dispose();
    // ... 清理其他你使用的材质资源
}
 
// 使用方法:
clearScene(scene);

2.选中物体

        如果放在像若依这种前端框架中,会有菜单栏导致计算坐标的位置发生偏移

使用clientX配合getBoundingClientRect函数计算坐标即可

    document.addEventListener( 'pointerdown', (event) =>{
       // 将鼠标位置转换成归一化设备坐标(-1 到 +1)
      // mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
      // mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
      let container = document.getElementById("app1");
      
      
      try{
        let getBoundingClientRect = container.getBoundingClientRect()
        mouse.x = ((event.clientX - getBoundingClientRect.left) / container.offsetWidth) * 2 - 1;
        mouse.y = -((event.clientY - getBoundingClientRect.top) / container.offsetHeight) * 2 + 1;
      }catch{

      }
      
      raycaster.setFromCamera( mouse, camera );
})

3.闪白问题

        Z-Fighting问题

        logarithmicDepthBuffer参数和多边形偏移不能同时设置

renderer = new THREE.WebGLRenderer( { logarithmicDepthBuffer: true } );
new THREE.Mesh(new THREE.BoxGeometry(50, 50, 50),
    new THREE.MeshBasicMaterial({
        color: 0x0000ff,
        polygonOffset: true,
        polygonOffsetFactor: 1.0,
        polygonOffsetUnits: 4.0
    }));

### Three.js 教程及相关文档 Three.js 是一个用于在网页上展示 3D 图形的强大工具,基于 WebGL 技术构建。以下是关于如何学习和使用 Three.js 的一些资源以及相关信息。 #### 官方文档 官方文档提供了详尽的 API 参考资料和基础教程,适合初学者入门并深入研究高级功能[^2]。 - **官方网站**: 提供了丰富的示例和详细的说明,帮助开发者快速掌握核心概念。访问地址为 [http://threejs.org](http://threejs.org)。 #### 初级教程推荐 如果希望从零开始学习 Three.js,则可以从以下几个方面入手: 1. 创建基本场景:包括初始化 renderer、camera 和 scene,并将其挂载至 HTML 页面中[^1]。 ```javascript const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); const geometry = new THREE.BoxGeometry(); const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); const cube = new THREE.Mesh(geometry, material); scene.add(cube); camera.position.z = 5; function animate() { requestAnimationFrame(animate); cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render(scene, camera); } animate(); ``` 2. 添加光源与材质:通过调整灯光位置和物体表面反射特性来增强视觉效果[^3]。 3. 动画实现:利用 `requestAnimationFrame` 方法制作平滑动画序列。 #### 高级应用案例 随着技能提升,可以尝试更复杂的项目,比如交互式排斥效应或者结合其他物理引擎如 Cannon.js 来模拟真实世界中的动态行为。 此外,WebGL 不断发展,配合 Three.js 能够创造出令人惊叹的作品集合,例如 Hi Monday 上的文章系列或是 cobosrl.co 中的效果演示[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值