首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当usingThreejs和ThreeCSG相减之前,如何更改CSG对象的位置

当usingThreejs和ThreeCSG相减之前,如何更改CSG对象的位置
EN

Stack Overflow用户
提问于 2015-01-31 01:20:53
回答 2查看 523关注 0票数 1

我正在尝试使用ThreeCSG来减少平台中的“漏洞”。我希望在更大的平台上的特定位置减去孔。

代码语言:javascript
复制
  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对象后重新定位它的文档。

EN

回答 2

Stack Overflow用户

发布于 2015-11-27 21:14:28

ThreeCSG source中使用的技术是将几何图形转换为网格,然后平移网格,然后从转换后的网格生成网格。请看这里的第二行:

代码语言:javascript
复制
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 );
票数 1
EN

Stack Overflow用户

发布于 2015-02-03 09:42:19

为了在剪切之前将网格设置在正确的位置,可以对几何体本身执行矩阵变换。

代码语言:javascript
复制
platform.platform = new Physijs.BoxMesh(geometry, material, 0);
platform.platform.geometry.applyMatrix( new THREE.Matrix4().makeTranslation( 0, -i * 300, 0 ) );

有可能是一个bug阻止了THREEBSP使用position属性( Physijs会对此造成混乱吗?我从来没有用过它)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28241263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档