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

如何在Three.js中按顺序依次显示多对象(间隔0.5秒)

实现Three.js Mesh对象按顺序依次显示的方案

刚好做过类似的需求,给你整理个清晰的实现思路和代码修改方案:

首先我们需要几个状态变量来控制显示节奏,然后在渲染循环里通过时间判断来切换Mesh的可见性:

步骤1:定义控制变量

在你的场景初始化代码里(全局或合适的作用域)添加这几个变量:

let currentIndex = 0; // 当前显示的Mesh索引
const displayDuration = 500; // 每个Mesh的停留时长,单位毫秒(这里是0.5秒)
let lastSwitchTime = Date.now(); // 记录上一次切换的时间戳

步骤2:初始化Mesh时默认隐藏

修改你创建Mesh的循环,把所有Mesh默认设置为不可见,之后再手动开启第一个的可见性:

for ( var i = 0; i < count; i ++ ) {
  // 你的geometry和material创建逻辑保持不变
  var mesh = new THREE.Mesh(geometry, material);
  mesh.visible = false; // 默认隐藏所有Mesh
  scene.add(mesh);
  objects.push(mesh);
}
// 初始显示第一个Mesh
objects[currentIndex].visible = true;

步骤3:在渲染循环里实现切换逻辑

修改你的render函数,加入时间判断和切换逻辑:

function render() {
  requestAnimationFrame(render);
  
  const now = Date.now();
  // 检查是否到达切换时间
  if (now - lastSwitchTime >= displayDuration) {
    // 隐藏当前显示的Mesh
    objects[currentIndex].visible = false;
    // 切换到下一个索引(用取模实现循环显示,到最后一个后回到第一个)
    currentIndex = (currentIndex + 1) % objects.length;
    // 显示新的Mesh
    objects[currentIndex].visible = true;
    // 更新切换时间戳
    lastSwitchTime = now;
  }
  
  renderer.render(scene, camera);
}

可选调整:如果不需要循环显示

如果你希望到最后一个Mesh就停止切换(而不是回到第一个),把索引切换的代码改成这样:

currentIndex += 1;
if (currentIndex < objects.length) {
  objects[currentIndex].visible = true;
} else {
  // 这里可以根据需求处理,比如停留在最后一个Mesh
  currentIndex = objects.length - 1;
  // 或者如果要全部隐藏,可以取消下面的注释,同时去掉上面的currentIndex赋值
  // objects.forEach(mesh => mesh.visible = false);
}

这个方案的核心是利用Date.now()获取时间戳,对比间隔来触发切换,避免用setTimeout这类和渲染循环不同步的方法,保证动画的流畅性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:32:44