我正在使用D3-threeD2.js将SVG文件转换为THREE.Shape
(s),然后我可以使用three.js进行拉伸。除孔外,它的工作正常。
让我们说我有一个甜甜圈形状:一个内有洞的圆盘。该库为我提供了一个代表光盘的THREE.Shape
和一个代表该洞的THREE.Shape
。
我知道如果我有THREE.Path
,我可以在光盘上打一个洞,但我没有 - 我有THREE.Shape
。
那么有没有办法从THREE.Path
获得THREE.Shape
?或者,有没有办法在THREE.Shape
中用另一个THREE.Shape
?
答案 0 :(得分:2)
我再次在这里发帖,因为我最近意识到这个问题的答案实在太简单了,不值得一提。
THREE.Shape
延伸THREE.Path
您只需使用THREE.Shape
直接在另一个形状上打孔即可将其添加为洞。
我以两种不同的方式测试它。直接使用形状:
var shape = new THREE.Shape();
//...define your shape
var hole = new THREE.Shape();
//...define your hole
shape.holes.push( hole );
shape.extrude( extrusionSettings );
但是,如果使用toShapes
方法创建形状的路径,它也可以工作:
var path = new THREE.Path();
//...define your path
var shape = path.toShapes()[0];
var hole = new THREE.Shape();
//...define your hole
var holes = hole.toShapes();
shape.holes = holes;
shape.extrude( extrusionSettings );
查看小提琴 here ,证明两种解决方案都有效...
答案 1 :(得分:0)
GitHub上有一个ThreeCSG
enter link description here库,可用于使用Three.js
网格执行布尔操作。这可能适合你。
该库有点过时,但有许多分叉也与最新的Three.js
版本兼容。
我认为使用点数组将形状转换为路径应该很难。
var shape = ... your shape ...
var points = shape.extractAllPoints();
var path = new THREE.Path( points );
未经测试,但我认为它应该有效。