为什么使用 ThreeBSP.js 创建的网格无法与 MeshNormalMaterial 以外的任何 material 一起正常工作?
Why mesh created with ThreeBSP.js is not working properly with any material other than MeshNormalMaterial?
只有当我在倒数第二行(result = resultBSP.toMesh(materialNormal);
)中使用 MeshNormalMaterial
时,骰子才看起来像一个骰子。对于任何其他 material,它看起来就像一个没有 subtraction
(点)的立方体。我正在使用的 ThreeBSP
(ThreeCSG 升级)库位于 here。
使用MeshNormalMaterial
没有问题。它几乎没有任何修改选项。 (它不像其他 material 那样接受参数)。
这是我用来创建骰子的函数:
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);
}
它确实适用于其他材质,例如 THREE.MeshPhongMaterial
。这个 jsfiddle 使用你的 buildDice()
-function 可以帮助你:
http://jsfiddle.net/L0rdzbej/152/
您必须在合并几何之前更新网格的矩阵,并且最好不要为此使用已弃用的函数。
Three.jsr73
只有当我在倒数第二行(result = resultBSP.toMesh(materialNormal);
)中使用 MeshNormalMaterial
时,骰子才看起来像一个骰子。对于任何其他 material,它看起来就像一个没有 subtraction
(点)的立方体。我正在使用的 ThreeBSP
(ThreeCSG 升级)库位于 here。
使用MeshNormalMaterial
没有问题。它几乎没有任何修改选项。 (它不像其他 material 那样接受参数)。
这是我用来创建骰子的函数:
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);
}
它确实适用于其他材质,例如 THREE.MeshPhongMaterial
。这个 jsfiddle 使用你的 buildDice()
-function 可以帮助你:
http://jsfiddle.net/L0rdzbej/152/
您必须在合并几何之前更新网格的矩阵,并且最好不要为此使用已弃用的函数。
Three.jsr73