为什么使用ThreeBSP.js创建的网格与MeshNormalMaterial以外的任何材质都无法正常工作?

时间:2015-12-01 15:59:03

标签: javascript three.js threecsg

只有在最后一行(MeshNormalMaterial)中使用result = resultBSP.toMesh(materialNormal);时,骰子看起来才像骰子。对于任何其他材料,它看起来就像一个没有subtraction(点)的立方体。我正在使用的ThreeBSP(ThreeCSG升级)库位于here。 使用MeshNormalMaterial没有问题。它几乎没有任何修改它的选项。 (它不像其他材料那样采用参数)。 任何建议都会非常感激。 这是我用来制作骰子的功能:

function buildDice(){

    var materialNormal = new THREE.MeshNormalMaterial();
    var diceCube = new THREE.Mesh( new THREE.BoxGeometry(100,100,100), materialNormal);

    diceCube.position.x = 0;
    diceCube.position.y = 50;
    diceCube.position.z = 0;

    diceCube.geometry.computeFaceNormals();
    diceCube.geometry.computeVertexNormals();

    var cubeBSP = new ThreeBSP(diceCube);

    var sphereGeometry = new THREE.SphereGeometry(75,16,8);
    var sphereMesh = new THREE.Mesh(sphereGeometry, materialNormal);

    sphereMesh.scale.x = 0.17;
    sphereMesh.scale.y = 0.17;
    sphereMesh.scale.z = 0.17;

    //coords of the spheres 
    var xPositions = [....]; // coordinates for xPositions of sphereMesh
    var yPositions = [....];
    var zPositions = [....];


    var diceDots    = new THREE.Geometry();

    for(var i = 0; i < xPositions.length; i++){

        sphereMesh.position.x   = xPositions[i];
        sphereMesh.position.y   = yPositions[i];
        sphereMesh.position.z   = zPositions[i];
        THREE.GeometryUtils.merge(diceDots, sphereMesh);
    }

    var dotsMesh = new THREE.Mesh(diceDots, materialNormal);
    dotsMesh.geometry.computeFaceNormals();
    dotsMesh.geometry.computeVertexNormals();

    var dotsBSP = new ThreeBSP(dotsMesh);
    var resultBSP = cubeBSP.subtract(dotsBSP);

    result = resultBSP.toMesh(materialNormal);
    scene.add(result);

}

1 个答案:

答案 0 :(得分:1)

它适用于其他材质,例如THREE.MeshPhongMaterial。使用buildDice()函数的这个jsfiddle可以帮助您: http://jsfiddle.net/L0rdzbej/152/

enter image description here

您必须在合并几何体之前更新网格的矩阵,并且最好不要使用已弃用的函数。

Three.js r73