How do I construct a hollow cylinder in Three.js

后端 未结 4 1684
伪装坚强ぢ
伪装坚强ぢ 2021-01-05 17:27

I\'m having difficulties constructing a hollow cylinder in Three.js.

Should I go and construct it using CSG or by stitching the vertices together?

相关标签:
4条回答
  • 2021-01-05 17:58

    Use SVGloader to load a circle of desired radius (as an SVG). Set the geometry to ExtrudeBufferGeometry and give it your desired height as depth in the extrude settings object.

    0 讨论(0)
  • 2021-01-05 18:00
    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);
    
    0 讨论(0)
  • 2021-01-05 18:02

    It is unlikely that you would have to stitch vertices together. If your cylinder has no thickness, you can use THREE.CylinderGeometry(). If it does have thickness, you can use CSG.

    0 讨论(0)
  • 2021-01-05 18:05

    This solution uses ChandlerPrall's ThreeCSG.js project: http://github.com/chandlerprall/ThreeCSG

    (For now, I recommend using the experimental version that supports materials - the uv branch - http://github.com/chandlerprall/ThreeCSG/tree/uvs)

    Here's the code you will need:

    // 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 );
    
    0 讨论(0)
提交回复
热议问题