You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Three.js在两个TubeBufferGeometry之间绘制平面?

填充两个闭合管状几何体之间区域的解决方案

你已经搞定了两个平行的闭合管状结构,要填充它们之间的区域其实挺简单——因为这两条曲线是共面(Z=0平面)的嵌套闭合曲线,我们可以利用Three.js的Shape和ShapeBufferGeometry直接生成这个填充面。

具体实现步骤:

  • 把两个CatmullRomCurve3曲线转换成2D路径(提取X、Y坐标就行,Z值都是0可以忽略)
  • 创建一个外层Shape,将内层曲线作为**孔洞(holes)**添加进去
  • 用这个带孔洞的Shape生成平面几何体,赋予黄色材质后加到场景里

修改后的完整代码示例:

// 你的原始曲线和管状几何体代码
var closedSpline = new THREE.CatmullRomCurve3( [ 
    new THREE.Vector3( -60, -100, 0 ), 
    new THREE.Vector3( -60, 20, 0 ), 
    new THREE.Vector3( -60, 120, 0 ), 
    new THREE.Vector3( 60, 120, 0 ), 
    new THREE.Vector3( 60, -100, 0 )
] ); 
closedSpline.curveType = 'catmullrom'; 
closedSpline.closed = true; 

var closedSpline1 = new THREE.CatmullRomCurve3( [ 
    new THREE.Vector3(-50, -90, 0), 
    new THREE.Vector3(-50, 10, 0 ), 
    new THREE.Vector3(-50, 110, 0 ), 
    new THREE.Vector3(50, 110, 0 ), 
    new THREE.Vector3(50, -90, 0 ) 
] ); 
closedSpline1.curveType = 'catmullrom'; 
closedSpline1.closed = true; 

// 生成管状几何体(你的原始代码)
var tubeGeometry = new THREE.TubeBufferGeometry( closedSpline, 100, 1,5, true ); 
var material = new THREE.MeshLambertMaterial( { color: 0xb00000, wireframe: false } ); 
var mesh = new THREE.Mesh( tubeGeometry, material ); 
scene.add( mesh ); 

var tubeGeometry1 = new THREE.TubeBufferGeometry( closedSpline1, 100, 1,5, true ); 
var material1 = new THREE.MeshLambertMaterial( { color: 0xb00000, wireframe: false } ); 
var mesh1 = new THREE.Mesh( tubeGeometry1, material1 ); 
scene.add( mesh1 ); 

// 新增:生成两个曲线之间的黄色填充面
// 1. 将3D曲线转换为2D路径点(匹配Tube的分段数)
function curveToShapePoints(curve) {
    return curve.getPoints(100).map(point => new THREE.Vector2(point.x, point.y));
}

// 2. 创建外层Shape,并添加内层曲线作为孔洞
var outerShape = new THREE.Shape(curveToShapePoints(closedSpline));
outerShape.holes.push(new THREE.Path(curveToShapePoints(closedSpline1)));

// 3. 生成填充面几何体并添加到场景
var fillGeometry = new THREE.ShapeBufferGeometry(outerShape);
var fillMaterial = new THREE.MeshLambertMaterial({ 
    color: 0xffff00, 
    side: THREE.DoubleSide // 开启双面渲染,确保正反都能看到黄色
}); 
var fillMesh = new THREE.Mesh(fillGeometry, fillMaterial);
scene.add(fillMesh);

关键细节提醒:

  • curve.getPoints(100):采样点数量和你创建Tube时的分段数保持一致,能让填充面的精度和管状结构匹配,避免出现错位
  • 如果发现填充区域不对,大概率是内外曲线的缠绕顺序不一致(一个顺时针一个逆时针),可以反转内层路径的点顺序试试:curveToShapePoints(closedSpline1).reverse()

这样就能得到你想要的两个红色管状之间的黄色填充平面啦!

内容的提问来源于stack exchange,提问作者GAURANG KORANT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:19