javascript - 使用Threejs 和 ThreeCSG 时如何在减法之前更改 CSG 对象的位置

标签 javascript three.js 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 对象后重新定位“洞”的文档。

最佳答案

ThreeCSG source 中使用的技术是将几何体转换为网格,然后平移网格,然后从平移后的网格创建 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 );

关于javascript - 使用Threejs 和 ThreeCSG 时如何在减法之前更改 CSG 对象的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28241263/

相关文章:

javascript - Three.js - 处理大量实例

css - Three.js 旋转相机到特定位置

javascript - 减去的几何形状会导致奇怪的照明

three.js - ThreeCSG bool 运算产生意外的网格结果

Javascript | P5.JS 库 - 贪吃蛇游戏 (X) 未定义

javascript - 如何用 Peg.js 打开文件?

javascript - 添加一个 THREE.Points 到场景 : THREE. Object3D.add : object not an instance of THREE. Object3D (Javascript)

javascript - 期望体积结果时的 Threecsg 平面

javascript - AngularJS 中 header 和 body 部分具有不同依赖关系的单独模块

返回全局分配给自身的 Javascript 函数,然后分配给其他对象