p5.js 绘制 3D 椭球体 ellipsoid

点赞 + 关注 + 收藏 = 学会了

ellipsoid() 是 p5.js 中用于绘制 3D 椭球体的函数,就像 3D 版本的椭圆。它可以创建各种形状的球体和椭球体,是 3D 绘图中非常基础且常用的函数。

基本语法

javascript 复制代码
ellipsoid(w, h, d, [detailX], [detailY])
  • w:椭球体在 X 轴方向的宽度
  • h:椭球体在 Y 轴方向的高度
  • d:椭球体在 Z 轴方向的深度
  • detailX(可选):X 方向的细节级别,值越大表面越光滑,默认 12
  • detailY(可选):Y 方向的细节级别,默认 12

动手试试

先绘制一个简单的椭球体,在setup()中设置 3D 画布,并在draw()中设置相机视角。

复制代码
复制代码
js 复制代码
function setup() {  // 创建3D画布,需要指定WEBGL参数  createCanvas(600, 400, WEBGL); }  function draw() {  background(220);    // 添加简单光照,让3D效果更明显  ambientLight(150);  pointLight(255, 255, 255, 100, 100, 200);    // 旋转椭球体,让我们能看到3D效果  rotateX(frameCount * 0.01);  rotateY(frameCount * 0.01);    // 绘制一个球体(当w=h=d时就是球体)  fill(100, 150, 255);  ellipsoid(80, 150, 100); }
复制代码

这段代码很简单,我逐一讲讲关键方法

  • createCanvas(600, 400, WEBGL):创建 3D 画布,必须添加WEBGL参数才能使用 3D 函数
  • ambientLight()和pointLight():添加光照让 3D 物体有立体感
  • rotateX()和rotateY():让物体随时间旋转,方便观察 3D 效果
  • ellipsoid(80, 150, 100):绘制一个椭球体的三维参数。而当三个维度数值相等时,绘制的就是一个标准球体

不同参数的效果

一起看看改变参数会产生什么效果:

js 复制代码
function setup() {
  createCanvas(800, 600, WEBGL);
}

function draw() {
  background(20);
  ambientLight(100);
  directionalLight(255, 255, 255, 0, 0, -1);
  
  // 旋转整个场景
  orbitControl(); // 允许用户通过鼠标旋转视角
  
  // 左侧:橄榄球形状(X轴拉长)
  push(); // 保存当前坐标系状态
  translate(-200, 0, 0); // 向左移动
  fill(255, 100, 100);
  ellipsoid(100, 50, 50); // X轴更长
  pop(); // 恢复坐标系状态
  
  // 中间:正常球体
  push();
  fill(100, 255, 100);
  ellipsoid(80, 80, 80); // 所有轴相等
  pop();
  
  // 右侧:扁平形状(Y轴压缩)
  push();
  translate(200, 0, 0); // 向右移动
  fill(100, 100, 255);
  ellipsoid(80, 40, 80, 24, 24); // 更高细节级别
  pop();
}

搞点猛的

做一个动态气泡效果。

js 复制代码
let bubbles = [];
let numBubbles = 15;

function setup() {
  createCanvas(800, 600, WEBGL);
  
  // 创建多个气泡
  for (let i = 0; i < numBubbles; i++) {
    bubbles.push({
      x: random(-width/2, width/2),
      y: random(-height/2, height/2),
      z: random(-500, 500),
      size: random(20, 80),
      speed: random(0.5, 3),
      rotX: random(0.01),
      rotY: random(0.01),
      hue: random(180, 240) // 蓝色系气泡
    });
  }
  
  // 启用鼠标控制视角
  orbitControl();
}

function draw() {
  background(10);
  
  // 添加环境光和方向光
  ambientLight(30);
  directionalLight(255, 255, 255, 0, 1, -1);
  
  // 绘制所有气泡
  for (let b of bubbles) {
    push();
    
    // 移动到气泡位置
    translate(b.x, b.y, b.z);
    
    // 旋转气泡
    rotateX(frameCount * b.rotX);
    rotateY(frameCount * b.rotY);
    
    // 设置气泡颜色和透明度
    noStroke();
    fill(b.hue, 200, 255, 200);
    
    // 绘制椭球体作为气泡
    let w = b.size * random(0.8, 1.2); // 轻微变形,更自然
    let h = b.size * random(0.8, 1.2);
    let d = b.size * random(0.8, 1.2);
    ellipsoid(w, h, d, 20, 20);
    
    pop();
    
    // 移动气泡(Z轴方向)
    b.z += b.speed;
    
    // 当气泡移出视野,重置位置
    if (b.z > 600) {
      b.z = -600;
      b.x = random(-width/2, width/2);
      b.y = random(-height/2, height/2);
    }
  }
}

这个案例创建了一个气泡数组,每个气泡都有自己的位置、大小、速度等属性。使用随机值让每个气泡的大小略有不同,看起来更自然。通过translate()将每个气泡放置在不同位置,每个气泡有独立的旋转速度,增加动态效果。使用半透明颜色和光照,营造出气泡的通透感,当气泡移出视野时,会在另一侧重新出现,形成循环效果。


以上就是本文的全部内容了,想了解更多P5.js玩法的工友欢迎关注《P5.js中文教程》

点赞 + 关注 + 收藏 = 学会了

相关推荐
八十天环游世界2 小时前
财务自动化项目的ROI怎么测算?要看哪些指标?
经验分享
网安小学生(兼顾数据库版)3 小时前
艾体宝 TrueFoundry 如何让企业 AI 工具集成避免 “孤岛化“?
经验分享·艾体宝·艾体宝it·艾体宝truefoundry
聪明的笨猪猪17 小时前
企业知识库AI架构选型:落地导向的架构决策与组件清单
经验分享·面试·架构·embedding·数据库架构
Go Work19 小时前
两个等值条件摆着,MySQL 偏要全表扫
经验分享·笔记
深圳智根网络程序开发1 天前
WordPress固定链接怎么设?改不对谷歌收录直接崩
经验分享
德思特1 天前
如何提升 5G 移动性切换验证效率?德思特 Amarisoft Callbox 新增 NR SA LTM 测试功能详解
经验分享·无线通信·车载通信
虹科数字化与AR1 天前
农业机械AR质检ROI怎么算?从搬运、测量、返工和交付成本入手
经验分享·ar·质检·农业机械
聪明的笨猪猪2 天前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
仓库日记2 天前
Excel进销存何时该换?用3项检查判断是否需要软件
经验分享·excel·进销存·开单软件
AI工具挖掘机2 天前
开源!2个Skill复刻带货视频、图文和Live,做百号矩阵
经验分享