当前位置: 首页 > news >正文

p5.js:绘制各种内置的几何体,还能旋转

向 豆包 提问:请编写 p5.js 示例, 绘制各种内置的几何体,能让这些几何体缓慢旋转。

cd p5-demo
copy .\node_modules\p5\lib\p5.min.js .

此代码创建了一个包含多个内置几何体的 3D 场景,每个几何体都有不同的颜色和位置。运行代码后,你会看到球体、立方体、圆锥体、圆柱体、圆环体和椭球体在画布上的展示。
编写  p5_demo_6.html  如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>p5.js Geometries</title>
  <script src="p5.min.js"></script>
</head>
<body>
<script>
    let angle = 0;

    function setup() {
      createCanvas(1000, 600, WEBGL);
    }

    function draw() {
      background(220);
      angle += 0.01;

      // 绘制球体 sphere
      push();
      translate(-300,-150, 0);
      rotateX(angle);
      rotateY(angle);
      stroke(255, 100);
      fill(128, 0, 0);
      sphere(100);
      pop();

      // 绘制立方体 box
      push();
      translate(0,-150, 0);
      rotateX(angle);
      rotateY(angle);
      stroke(255, 100);
      fill(128, 128, 128);
      box(150);
      pop();

      // 绘制圆锥体 cone
      push();
      translate(300,-150, 0);
      rotateX(angle);
      rotateY(angle);
      stroke(255, 100);
      fill(0, 0, 128);
      cone(100, 200);
      pop();

      // 绘制圆柱体 cylinder
      push();
      translate(-300, 100, 0);
      rotateX(angle);
      rotateY(angle);
      stroke(255, 100);
      fill(128, 128, 0);
      cylinder(100, 200);
      pop();

      // 绘制圆环体 torus
      push();
      translate(0, 100, 0);
      rotateX(angle);
      rotateY(angle);
      stroke(255, 100);
      fill(128, 0, 128);
      torus(100, 30);
      pop();

      // 绘制椭球体 ellipsoid
      push();
      translate(300, 100, 0);
      rotateX(angle);
      rotateY(angle);
      stroke(255, 100);
      fill(0, 128, 128);
      ellipsoid(100, 150, 50);
      pop();
    }

</script>
</body>
</html>

在上述代码中,定义了一个变量 angle 用于控制旋转角度。在 draw 函数里,每次绘制时 angle 都会增加 0.01,然后通过 rotateX 和 rotateY 方法让每个几何体绕 X 轴和 Y 轴旋转。这样就实现了几何体的缓慢旋转效果。

双击打开 p5_demo_6.html 


向 chat.deepseek.com 提问:请编写 p5.js 脚本,绘制各种内置的几何体,还能缓慢旋转。

下面是一个使用 p5.js 绘制各种内置几何体并使它们缓慢旋转的示例代码。这个脚本将绘制立方体、球体、圆锥体和圆柱体,并使它们围绕 Y 轴旋转。

编写 p5_demo_4.html  如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>p5.js Geometries</title>
  <script src="p5.min.js"></script>
</head>
<body>
<script>
let angle = 0;

function setup() {
  createCanvas(800, 600, WEBGL);
}

function draw() {
  background(30);
  
  // 设置光照
  pointLight(255, 255, 255, 0, 0, 500);
  ambientLight(100);
  
  // 绘制立方体
  push();
  translate(-width/4, -height/4, 0);
  rotateY(angle);
  fill(255, 0, 0);
  box(100);
  pop();
  
  // 绘制球体
  push();
  translate(width/4, -height/4, 0);
  rotateY(angle);
  fill(0, 255, 0);
  sphere(70);
  pop();
  
  // 绘制圆锥体
  push();
  translate(-width/4, height/4, 0);
  rotateY(angle);
  fill(0, 0, 255);
  cone(70, 150);
  pop();
  
  // 绘制圆柱体
  push();
  translate(width/4, height/4, 0);
  rotateY(angle);
  fill(255, 255, 0);
  cylinder(70, 150);
  pop();
  
  // 更新旋转角度
  angle += 0.01;
}
</script>
</body>
</html>

 双击打开 p5_demo_4.html 

代码说明:

  1. setup() 函数:初始化画布并设置为 3D 模式(使用 WEBGL)。

  2. draw() 函数:每一帧都会调用这个函数来绘制几何体。

  3. push() 和 pop():用于保存和恢复当前的绘图状态,确保每个几何体的变换不会影响其他几何体。

  4. translate():将几何体移动到画布的不同位置。

  5. rotateY():使几何体围绕 Y 轴旋转。

  6. box()sphere()cone()cylinder():分别绘制立方体、球体、圆锥体和圆柱体。

  7. angle:用于控制旋转的角度,每一帧增加 0.01,使几何体缓慢旋转。

运行效果:

  • 立方体、球体、圆锥体和圆柱体会分别位于画布的四个象限。

  • 所有几何体会围绕 Y 轴缓慢旋转。

  • 使用了点光源和环境光来增强视觉效果。


DeepSeek 还提供了程序员喜欢的示例 p5_demo_5.html 享受编程的快感。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>p5.js Geometries</title>
  <script src="p5.min.js"></script>
</head>
<body>
<script>
function setup() {
  createCanvas(1000, 600, WEBGL);
}

function draw() {
  background(220);
  rotateY(frameCount * 0.01); // 全局旋转
  // [ 立方体, 球体, 圆柱体, 圆锥体, 圆环体 ]
  const geometries = ['box','sphere','cylinder','cone','torus'];
  const spacing = 250;
  for (let i=0; i< geometries.length; i++) {
    push();
    translate(-spacing*2 + spacing*i, 0, 0);
    rotateZ(frameCount * 0.01);
    
    switch(geometries[i]) {
      case 'box':
        fill(255,0,0);
        box(50);
        break;
      case 'sphere':
        fill(0,255,0);
        sphere(50);
        break;
      case 'cylinder':
        fill(0,0,255);
        cylinder(50,100);
        break;
      case 'cone':
        fill(255,255,0);
        cone(50,100);
        break;
      case 'torus':
        fill(255,0,255);
        torus(50,20);
        break;
    }
    pop();
  }
}
</script>
</body>
</html>

双击打开 p5_demo_5.html 

相关文章:

  • 设计模式分类解析与JavaScript实现
  • Linux Redis安装部署、注册服务
  • 蓝桥杯专项复习——stl(stack、queue)
  • hadoop伪分布式搭建--启动过程中如果发现某个datanode出现问题,如何处理?
  • 24.策略模式实现日志
  • leetcode日记(101)填充每个节点的下一个右侧节点指针Ⅱ
  • Deepseek+QuickAPI:打造 MySQL AI 智能体入门篇(一)
  • CVE-2017-5645(使用 docker 搭建)
  • Java面试:集合框架体系
  • 【web逆向】优某愿 字体混淆
  • 提升fcp
  • 八、Prometheus 静态配置(Static Configuration)
  • 仿“东方甄选”直播商城小程序运营平台
  • Git的基本指令
  • 使用爬虫获取自定义API操作API接口
  • 通信协议传输过程中的序列化和反序列化机制
  • 【记】如何理解kotlin中的委托属性?
  • Python的基本知识
  • MySQL学习笔记
  • LSTA: Long Short-Term Attention for Egocentric Action Recognition
  • 美俄亥俄州北部发生火车撞人事故,致2人死亡、至少1人失踪
  • 牛市早报|上市公司重大资产重组新规出炉,4月经济数据将公布
  • 古稀之年的设计家吴国欣:重拾水彩,触摸老上海文脉
  • 俄需要达成怎样的特别军事行动结果?普京:包含四个方面
  • 人民日报和音:相信中国就是相信明天
  • 下辖各区密集“联手”,南京在下一盘什么样的棋?