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

p5.js WEBGL中如何设置3D对象层级让圆柱体显示在环面上层

问题说明

现有两个p5.js WEBGL模式下的3D对象:环面(torus)、圆柱体(cylinder),需求为圆柱体始终显示在环面上层,不被环面遮挡。

初始复现代码

侧放圆柱体版本(层级问题更易观察)

function setup() {
  createCanvas(400, 400, WEBGL);
}

function draw() {
  angleMode(DEGREES)
  background(220);
  noStroke();
  rotateX(30)
  // 绘制环面
  fill(241, 177, 102);
  torus(100, 40);
  // 绘制圆柱体
  fill(138, 78, 27);
  push();
  rotateX(90);
  cylinder(130, 10);
  pop();
}

平置圆柱体版本

function setup() {
  createCanvas(400, 400, WEBGL);
}

function draw() {
  angleMode(DEGREES)
  background(220);
  noStroke();
  // 绘制环面
  fill(241, 177, 102);
  torus(100, 40);
  // 绘制圆柱体
  fill(138, 78, 27);
  cylinder(130, 10);
}

已尝试的无效操作:

  • 绕Z轴旋转圆柱体
  • 调换两个对象的绘制顺序

解决方法

WEBGL模式默认开启深度测试,会严格按照3D空间的实际坐标判断遮挡关系,调换绘制顺序无法强制修改显示层级。要让圆柱体固定显示在环面上层,绘制圆柱体前调用noDepth()临时关闭深度测试即可,绘制完成后可调用depth()恢复正常深度判断。

修正后代码

function setup() {
  createCanvas(400, 400, WEBGL);
}

function draw() {
  angleMode(DEGREES)
  background(220);
  noStroke();
  rotateX(30)
  // 绘制下层环面
  fill(241, 177, 102);
  torus(100, 40);
  
  // 绘制上层圆柱体
  push();
  noDepth(); // 关闭深度测试,后续内容强制显示在上层
  fill(138, 78, 27);
  rotateX(90);
  cylinder(130, 10);
  pop();
}

如果不需要强制置顶、只是想让圆柱体自然放置在环面上方位置,可以给圆柱体加Y轴位移,比如translate(0, -50, 0)将圆柱体向上移动到环面顶部,不需要关闭深度测试也能得到正确的遮挡关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:21:35