我正在尝试使用 Three.js 为网页 3D 示例创建棋盘。但是,我当前的代码分配了三种颜色,而我只需要两种颜色(黑色/白色)。如何重构数学以产生正确的棋盘?
// Geometry
var cbgeometry = new THREE.PlaneGeometry( 500, 500, 8, 8 );
// Materials
var cbmaterials = [];
cbmaterials.push( new THREE.MeshBasicMaterial( { color: 0xffffff, side: THREE.DoubleSide }) );
cbmaterials.push( new THREE.MeshBasicMaterial( { color: 0x000000, side: THREE.DoubleSide }) );
cbmaterials.push( new THREE.MeshBasicMaterial( { color: 0x0000ff, side: THREE.DoubleSide }) );
// Assign a material to each face (each face is 2 triangles)
var l = cbgeometry.faces.length / 2;
for( var i = 0; i < l; i ++ ) {
var j = 2 * i;
cbgeometry.faces[ j ].materialIndex = i % 3;
cbgeometry.faces[ j + 1 ].materialIndex = i % 3;
}
// Mesh
cb = new THREE.Mesh( cbgeometry, new THREE.MeshFaceMaterial( cbmaterials ) );
scene.add( cb );
最佳答案
编辑:
如果我们的开发环境不同,我会建议修复此代码:
编辑2:
索引选择部分中的“j”应该是“i”,我刚刚更改了它。
试试这个:
// Geometry
var cbgeometry = new THREE.PlaneGeometry( 500, 500, 8, 8 );
// Materials
var cbmaterials = [];
cbmaterials.push( new THREE.MeshBasicMaterial( { color: 0xffffff, side: THREE.DoubleSide }) );
cbmaterials.push( new THREE.MeshBasicMaterial( { color: 0x000000, side: THREE.DoubleSide }) );
var l = cbgeometry.faces.length / 2; // <-- Right here. This should still be 8x8 (64)
console.log("This should be 64: " + l);// Just for debugging puporses, make sure this is 64
for( var i = 0; i < l; i ++ ) {
j = i * 2; // <-- Added this back so we can do every other 'face'
cbgeometry.faces[ j ].materialIndex = ((i + Math.floor(i/8)) % 2); // The code here is changed, replacing all 'i's with 'j's. KEEP THE 8
cbgeometry.faces[ j + 1 ].materialIndex = ((i + Math.floor(i/8)) % 2); // Add this line in, the material index should stay the same, we're just doing the other half of the same face
}
// Mesh
cb = new THREE.Mesh( cbgeometry, new THREE.MeshFaceMaterial( cbmaterials ) );
scene.add( cb );
我评论了我在哪里进行了行更改。
我将 Math.floor(i/8) 放入 Material 索引中以抵消所有其他层。否则,它只是垂直线。
此外,第三种 Material 被删除,只留下白色和黑色可供使用。
感谢您提出这个问题,解决这个问题很有趣!
关于javascript - Three.js - 棋盘平面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22689898/