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

Three.js数组存储对象位置设置:遇无法读取x属性未定义错误

解决“无法读取undefined的x属性”问题

我来帮你梳理下这个问题的可能原因和解决方案~

首先,你遇到的核心矛盾是:明明console.log(sceneObjects['player'])能输出完整的THREE.MorphAnimMesh对象,但在animate函数里访问它的position.x时却报错,这大概率是执行时机或者数据结构使用不当导致的。

1. 先修正sceneObjects的数据结构

你现在用数组来存储对象,同时又给数组添加字符串键(sceneObjects[name] = what),这其实违背了数组的设计初衷——数组是用来存储有序、数字索引的集合,而键值对存储更适合用普通对象。这种混用可能会导致一些意想不到的访问异常。

建议把sceneObjects改成普通对象:

// 初始化时用对象而非数组
const sceneObjects = {};

然后修改addToGlScene函数,去掉不必要的数组push操作(如果不需要维护有序对象列表的话):

function addToGlScene(what, name, glow, storage) {
  glScene.add(what);
  what.name = name;
  // 直接以键值对形式存储对象
  sceneObjects[name] = what;
  what.userData.glow = { glow: glow };
  what.userData.storage = { storage: storage };
}

2. 确保animate执行时对象已存在

另一个常见原因是:animate函数可能在你调用addToGlScene添加player对象之前就已经启动了。第一次执行animate时,sceneObjects['player']还未被赋值,自然会触发“无法读取undefined的x属性”的错误。

你可以在animate里先做存在性检查,再执行移动逻辑:

function animate() {
  requestAnimationFrame(animate);
  
  // 先确认player对象已存在,再操作position
  if (sceneObjects.player) {
    sceneObjects.player.position.x += 1;
  }
  
  // 其他渲染逻辑
  renderer.render(glScene, camera);
}

3. 排查作用域问题

还要确保sceneObjects是在animate和addToGlScene都能访问到的作用域里(比如全局作用域,或者同一个模块作用域),如果其中一个函数无法访问到这个变量,也会导致类似的错误。

按照上面的步骤调整后,应该就能正常修改对象的x轴位置了~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:07:40