Как я могу изменить положение моего объекта CSG перед вычитанием при использовании Threejs и ThreeCSG
Я пытаюсь вычесть "дыры" в платформах, используя ThreeCSG. Я хочу, чтобы отверстия были вычтены в определенных местах на большей платформе.
var geometry = new THREE.CubeGeometry( 500, 10, 500 );
var hole_geometry = new THREE.CubeGeometry( 50, 11, 50 );
var material = Physijs.createMaterial( new THREE.MeshLambertMaterial( { color: 0xEEEEEE } ), 0.2, 0.8 );
var hole_material = Physijs.createMaterial( new THREE.MeshLambertMaterial( { color: 0x000000, side: THREE.DoubleSide } ), 0.2, 0.8 );
var platform = { platform: null, hole: null };
// platform
platform.platform = new Physijs.BoxMesh(geometry, material, 0);
platform.platform.position.y = -i*300;
var platformBSP = new ThreeBSP( platform.platform );
// hole
platform.hole = new Physijs.BoxMesh(hole_geometry, hole_material, 0);
platform.hole.position.y = -i*300;
platform.hole.position.x = Math.floor(Math.random()*(251))*(Math.random() < 0.5 ? -1 : 1);
platform.hole.position.z = Math.floor(Math.random()*(251))*(Math.random() < 0.5 ? -1 : 1);
var holeBSP = new ThreeBSP( platform.hole );
platformBSP = platformBSP.subtract(holeBSP);
platform.platform = platformBSP.toMesh(material);
platform.platform.position.y = -i*300;
scene.add( platform_array[i].platform );
scene.add( platform_array[i].hole );
Моя проблема в том, что всякий раз, когда лунка преобразуется из Threejs в ThreeCSG, она не учитывает позицию, поэтому каждая дыра, созданная в платформе, является мертвой точкой, а не случайным местом.
Кажется, я не могу найти никакой документации о том, как изменить положение "дыры" после ее преобразования в объект ThreeCSG.
2 ответа
Техника, используемая в источнике ThreeCSG, состоит в том, чтобы преобразовать геометрию в сетку, затем преобразовать сетку, а затем сделать BSP из переведенной сетки. Смотрите вторую строку здесь:
var cube_geometry = new THREE.CubeGeometry( 3, 3, 3 );
var cube_mesh = new THREE.Mesh( cube_geometry );
cube_mesh.position.x = -7;
var cube_bsp = new ThreeBSP( cube_mesh );
var sphere_geometry = new THREE.SphereGeometry( 1.8, 32, 32 );
var sphere_mesh = new THREE.Mesh( sphere_geometry );
sphere_mesh.position.x = -7;
var sphere_bsp = new ThreeBSP( sphere_mesh );
var subtract_bsp = cube_bsp.subtract( sphere_bsp );
var result = subtract_bsp.toMesh( new THREE.MeshLambertMaterial({ shading: THREE.SmoothShading, map: THREE.ImageUtils.loadTexture('texture.png') }) );
result.geometry.computeVertexNormals();
scene.add( result );
Чтобы установить сетку в правильном месте перед резкой, вы можете выполнить матричное преобразование самой геометрии.
platform.platform = new Physijs.BoxMesh(geometry, material, 0);
platform.platform.geometry.applyMatrix( new THREE.Matrix4().makeTranslation( 0, -i * 300, 0 ) );
Возможно, ошибка заключается в том, что THREEBSP не может использовать атрибут position (Physijs связывается с этим? Я никогда не использовал его).