我在Three.js中制造空心圆柱有困难。
我应该使用CSG构建它还是将顶点拼接在一起?
答案 0 :(得分:7)
var extrudeSettings = {
amount : 2,
steps : 1,
bevelEnabled: false,
curveSegments: 8
};
var arcShape = new THREE.Shape();
arcShape.absarc(0, 0, 1, 0, Math.PI * 2, 0, false);
var holePath = new THREE.Path();
holePath.absarc(0, 0, 0.8, 0, Math.PI * 2, true);
arcShape.holes.push(holePath);
var geometry = new THREE.ExtrudeGeometry(arcShape, extrudeSettings);
答案 1 :(得分:6)
此解决方案使用ChandlerPrall的ThreeCSG.js项目:http://github.com/chandlerprall/ThreeCSG
(目前,我建议使用支持材料的实验版本 - 紫外线分支 - http://github.com/chandlerprall/ThreeCSG/tree/uvs)
以下是您需要的代码:
// Cylinder constructor parameters:
// radiusAtTop, radiusAtBottom, height, segmentsAroundRadius, segmentsAlongHeight
var smallCylinderGeom = new THREE.CylinderGeometry( 30, 30, 80, 20, 4 );
var largeCylinderGeom = new THREE.CylinderGeometry( 40, 40, 80, 20, 4 );
var smallCylinderBSP = new ThreeBSP(smallCylinderGeom);
var largeCylinderBSP = new ThreeBSP(largeCylinderGeom);
var intersectionBSP = largeCylinderBSP.subtract(smallCylinderBSP);
var redMaterial = new THREE.MeshLambertMaterial( { color: 0xff0000 } );
var hollowCylinder = intersectionBSP.toMesh( redMaterial );
scene.add( hollowCylinder );
答案 2 :(得分:2)
您不太可能必须将顶点拼接在一起。如果您的圆柱体没有厚度,则可以使用THREE.CylinderGeometry()
。如果 具有厚度,则可以使用CSG。
答案 3 :(得分:0)
使用SVGloader加载所需半径的圆(作为SVG)。将几何形状设置为ExtrudeBufferGeometry
,并在拉伸设置对象中为其指定所需的高度作为深度。