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

Angular+TypeScript开发Three.js旋转星场仅单星移动问题求助

问题根因

你在addStar函数内每次生成单颗星星时,都重新初始化了this.stars为全新的THREE.Group实例,并且把新的组单独添加到场景中。最终this.stars变量只会指向最后一次调用addStar生成的、仅包含1颗星星的组,所以旋转时只有最后一颗星星会动,剩下的199个星星各自属于独立的、没有被添加旋转动画的组,因此保持静止。

修复方案

调整星星组的初始化逻辑,全局仅创建1次星星组,所有星星都添加到同一个组内,仅将这个统一的组添加到场景1次即可。

修改后的代码参考:

private scene: THREE.Scene;
private stars: THREE.Group;

createScene = () => {
  // 原有场景初始化逻辑...

  // 全局仅初始化1次星星组
  this.stars = new THREE.Group();
  // 批量生成200颗星星
  Array(200).fill(undefined).forEach(this.addStar);
  // 整个星星组仅添加到场景1次
  this.scene.add(this.stars);

  // 原有其他逻辑...
}

addStar = () => {
  const geometry = new THREE.SphereGeometry(0.25, 24, 24);
  const material = new THREE.MeshStandardMaterial({
    color: 0xffffff,
    emissive: 0xffffff,
    emissiveIntensity: 1,
    roughness: 0,
    metalness: 0.5
  });
  const star = new THREE.Mesh(geometry, material);

  const [x, y, z] = Array(3)
    .fill(undefined)
    .map(() => THREE.MathUtils.randFloatSpread(100));

  star.position.set(x, y, z);
  // 直接将星星添加到全局的星星组中,无需重复创建组和添加场景
  this.stars.add(star);
};

你原有动画逻辑this.stars.rotation.y += 0.005;无需修改,调整后所有星星都会跟随组统一旋转。

优化提示:可将星星的几何体、材质提取到addStar函数外全局复用,避免重复创建200份相同的资源,降低内存占用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:54:06