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

Three.js InstanceMatrix设置位置时Z轴失效问题求助

问题解决:Three.js棋盘地板Z轴移动失效

你的代码核心问题是InstancedMesh的实例数量设置错误,导致Z轴方向的瓷砖根本没被创建出来:

在这段代码里:

const floor = new THREE.InstancedMesh(geometry, material, countXY);

你传入的实例总数是countXY(1000),但后续循环却尝试创建countXY * countXY(1000000)个实例。超过InstancedMesh预设数量的实例操作(setMatrixAt/setColorAt)不会生效,所以只有X轴方向的一行瓷砖能显示,Z轴方向的实例被直接忽略。

修复步骤

  1. 修正InstancedMesh的实例数量,改为实际需要的count:
const floor = new THREE.InstancedMesh(geometry, material, count);
  1. (可选)优化性能:1000x1000的实例总数达到百万级,会严重影响渲染性能。建议将countXY调整为更合理的数值,比如100,这样实例总数是10000,既能满足视觉需求,又能保证流畅性。

修复后的完整代码

addFloor()
{
    const lightColor = new THREE.Color(0xB8D0D9);
    const darkColor = new THREE.Color(0xADC4CC);

    const cellSize = 1000;
    const countXY = 100; // 调整为更合理的数值,避免性能问题
    const count = countXY * countXY;
    const xy0 = 0;

    const geometry = new THREE.BoxGeometry(cellSize, cellSize, cellSize);
    const material = new THREE.MeshBasicMaterial({side: THREE.DoubleSide, opacity: 0.6, depthWrite: false});

    // 修正实例数量为count
    const floor = new THREE.InstancedMesh(geometry, material, count);

    let color;
    let idX = 0;
    let idZ = 0;
    for (let i = 0; i < count; i++) {
        idX = i % countXY;
        idZ = Math.floor(i / countXY);
        color = (idX + idZ) % 2 === 0 ? lightColor : darkColor;
        
        const pos = new THREE.Vector3(
            xy0 + idX * cellSize,
            0,
            xy0 + idZ * cellSize
        );

        const m = new THREE.Matrix4();
        m.makeTranslation(pos.x, pos.y, pos.z);

        floor.setMatrixAt(i, m);
        floor.setColorAt(i, color);
    }
    floor.instanceColor.needsUpdate = true;
    floor.instanceMatrix.needsUpdate = true;

    this.add(floor);
}

额外提醒:代码里的Vector3需要加上THREE.前缀,否则会报未定义错误(除非你提前单独导入了该类)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:01:19