0

0

如何在 Three.js 中移除场景中的 OBJ 模型

花韻仙語

花韻仙語

发布时间:2026-01-14 11:15:09

|

713人浏览过

|

来源于php中文网

原创

如何在 Three.js 中移除场景中的 OBJ 模型

本文介绍如何在 three.js 中动态移除已加载的 obj 模型,包括设置 visible = false 隐藏模型和调用 scene.remove() 彻底从场景中删除对象,并提供可直接集成到现有代码的完整示例。

在 Three.js 中,移除一个已添加到场景(THREE.Scene)中的 3D 对象(如通过 OBJLoader 加载的模型)非常简单,但关键在于必须持有对该对象的引用。你当前的代码中,loader.load() 的回调函数内直接调用了 scene.add(object),但未将 object 保存为全局或模块级变量,导致后续无法访问它——这是初学者最常见的“找不到对象可删”的根本原因。

✅ 正确做法:保存引用 + 移除/隐藏

你需要做两件事:

  1. 保存加载完成的对象引用(例如赋值给一个 let loadedObj = null 变量);
  2. 在按钮点击(或 GUI 操作)时,调用 scene.remove(loadedObj) 或设置 loadedObj.visible = false。

以下是对你原始代码的关键修改部分(仅展示需改动/新增的逻辑,其余结构保持不变):

萝卜简历
萝卜简历

免费在线AI简历制作工具,帮助求职者轻松完成简历制作。

下载
// ? 新增:声明可被全局访问的模型引用变量
let loadedObj = null;
let loadedObj2 = null; // 若需管理多个模型,也建议分别声明

// 修改 loadtavel 函数:保存引用
function loadtavel() {
    loader.load(
        'assets/objtest.obj',
        function (object) {
            scene.add(object);
            loadedObj = object; // ✅ 保存引用!
        },
        (xhr) => console.log((xhr.loaded / xhr.total * 100) + '% loaded'),
        (error) => console.error('OBJ load error:', error)
    );
}

// 修改第二个加载逻辑(untitled.obj),同样保存引用
loader.load(
    'assets/untitled.obj',
    function (object) {
        scene.add(object);
        object.translateY(10);
        loadedObj2 = object; // ✅ 保存第二个模型引用
    },
    (xhr) => console.log((xhr.loaded / xhr.total * 100) + '% loaded'),
    (error) => console.error('OBJ load error:', error)
);

// ? 新增:移除函数(以 loadedObj 为例)
function removeLoadedObj() {
    if (loadedObj && scene.children.includes(loadedObj)) {
        scene.remove(loadedObj);
        console.log('OBJ removed from scene');
        loadedObj = null; // ? 建议置空,避免重复移除报错
    }
}

// ? 可选:仅隐藏(不从 scene 移除,性能开销更小)
function hideLoadedObj() {
    if (loadedObj) {
        loadedObj.visible = false;
        console.log('OBJ hidden');
    }
}

// 更新 GUI 控制项(绑定到新函数)
const obj = { add: loadtavel };
const obj2 = { remove: removeLoadedObj }; // 注意:这里改用 remove 方法名更语义化

const gui = new GUI();
const cubeFolder = gui.addFolder('Model Control');
cubeFolder.add(obj, 'add').name('Load OBJ');
cubeFolder.add(obj2, 'remove').name('Remove OBJ'); // ? 点击即触发移除
cubeFolder.open();

⚠️ 重要注意事项

  • scene.remove() 是单向操作:移除后对象不再参与渲染、碰撞检测或更新逻辑;若需再次显示,必须重新加载或提前缓存并 scene.add() 回来。
  • visible = false 更轻量:适合频繁切换显示/隐藏的场景(如 UI 交互),不涉及内存释放,但对象仍保留在 scene.children 中。
  • 确保对象存在且属于 scene:调用 scene.remove() 前务必检查 if (obj && scene.children.includes(obj)),否则可能引发静默失败或警告。
  • 材质与几何体不会自动销毁:scene.remove() 不会释放 GPU 内存;如需彻底清理(如切换大量模型),应手动调用 geometry.dispose() 和 material.dispose()(本例中因是初学者项目,通常可忽略,但大型应用需注意)。

✅ 总结

移除 OBJ 的核心不是“找 API”,而是管理好对象生命周期:加载时存引用 → 交互时查引用 → 移除前做校验 → 清理后重置引用。掌握这一模式,你不仅能删除 OBJ,还能轻松控制任意 THREE.Object3D 子类(如 Mesh、Group、Line 等)的显隐与增删。

现在,点击 GUI 中的 “Remove OBJ” 按钮,模型将立即从画面中消失——你已迈出 Three.js 动态场景控制的第一步。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

737

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

737

2023.08.22

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5270

2023.08.17

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号