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轴方向的实例被直接忽略。
修复步骤
- 修正InstancedMesh的实例数量,改为实际需要的
count:
const floor = new THREE.InstancedMesh(geometry, material, count);
- (可选)优化性能: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
相关产品推荐
相关产品推荐

