74浏览
查看: 74|回复: 0

[ESP8266/ESP32] Firebeetle 2 ESP32-S3 旋转球体

[复制链接]
上一次介绍了如何使用FireBeetle 2 ESP32S3 实现 VGA 输出,这次展示一下使用这块板子绘制一个球体。这个项目是根据 https://mp.weixin.qq.com/s/PDgzFQlmOjfZlXK_JpH24g  文章设计的。对比原文,改动并不大,主要是实现了moveto() lineto() 两个函数。前者的意思是相当于移动一个虚拟的画笔到画布上的某个位置;后者的意思是从当前虚拟的画笔位置绘制一条直线到画布上指定位置。

  1. #include "VGA.h"
  2. #include <GfxWrapper.h>
  3. VGA vga;
  4. //Mode mode = Mode::MODE_320x240x60;
  5. Mode mode = Mode::MODE_640x480x60;//MODE_640x480x60;
  6. GfxWrapper<VGA> gfx(vga, mode.hRes, mode.vRes);
  7. int CurrentX, CurrentY;
  8. void moveto(int X, int Y) {
  9.   CurrentX = X;
  10.   CurrentY = Y;
  11. }
  12. void lineto(int X, int Y) {
  13.   gfx.drawLine(CurrentX, CurrentY, X, Y, 0x700);
  14.   moveto(X, Y);
  15. }
  16. void HideSphere(float R, int alfa, int beta, int HideFlag)
  17. {
  18.   int i, j, k;
  19.   float x[4], y[4], z[4], x1[4], y1[4], z1[4], sx[4], sy[4];
  20.   double a1, a2, b1, b2, c, d, xn, yn, zn, vn;
  21.   c = alfa * PI / 180.0;
  22.   d = beta * PI / 180.0;
  23.   for (j = 0; j < 180; j = j + 5)
  24.   {
  25.     a1 = j * PI / 180.0;
  26.     a2 = (j + 5) * PI / 180.0;
  27.     for (i = 0; i < 360; i = i + 5)
  28.     {
  29.       b1 = i * PI / 180.0;
  30.       b2 = (i + 5) * PI / 180.0;
  31.       x[0] = R * sin(a1) * cos(b1); y[0] = R * sin(a1) * sin(b1); z[0] = R * cos(a1);
  32.       x[1] = R * sin(a2) * cos(b1); y[1] = R * sin(a2) * sin(b1); z[1] = R * cos(a2);
  33.       x[2] = R * sin(a2) * cos(b2); y[2] = R * sin(a2) * sin(b2); z[2] = R * cos(a2);
  34.       x[3] = R * sin(a1) * cos(b2); y[3] = R * sin(a1) * sin(b2); z[3] = R * cos(a1);
  35.       for (k = 0; k < 4; k++)
  36.       {
  37.         x1[k] = x[k] * cos(c) - y[k] * sin(c);
  38.         y1[k] = x[k] * sin(c) * cos(d) + y[k] * cos(c) * sin(d) + z[k] * sin(d);
  39.         z1[k] = -x[k] * sin(c) * sin(d) - y[k] * cos(c) * sin(d) + z[k] * cos(d);
  40.         sx[k] = 320 - x1[k];
  41.         sy[k] = 240 - z1[k];
  42.       }
  43.       xn = (y1[2] - y1[0]) * (z1[3] - z1[1]) - (y1[3] - y1[1]) * (z1[2] - z1[0]);
  44.       yn = -(x1[2] - x1[0]) * (z1[3] - z1[1]) + (x1[3] - x1[1]) * (z1[2] - z1[0]);
  45.       zn = (x1[2] - x1[0]) * (y1[3] - y1[1]) - (x1[3] - x1[1]) * (y1[2] - y1[0]);
  46.       vn = sqrt(xn * xn + yn * yn + zn * zn);
  47.       xn = xn / vn;
  48.       yn = yn / vn;
  49.       zn = zn / vn;
  50.       if (!HideFlag || yn >= 0.0)
  51.       {
  52.         moveto(sx[0], sy[0]);
  53.         lineto(sx[1], sy[1]);
  54.         lineto(sx[2], sy[2]);
  55.         lineto(sx[3], sy[3]);
  56.         lineto(sx[0], sy[0]);
  57.       }
  58.     }
  59.   }
  60. }
  61. void setup()
  62. {
  63.   Serial.begin(115200);
  64.   delay(5000);
  65.   if (psramInit()) {
  66.     log_d("Total heap: %d", ESP.getHeapSize());
  67.     log_d("Free heap: %d", ESP.getFreeHeap());
  68.     log_d("Total PSRAM: %d", ESP.getPsramSize());
  69.     log_d("Free PSRAM: %d", ESP.getFreePsram());
  70.   }
  71.   //const PinConfig pins(4, 5, 6, 7, 8,  9, 10, 11, 12, 13, 14,  15, 16, 17, 18, 21,  1, 2);
  72.   const PinConfig pins(-1,-1,6,7,8,  -1,-1,-1,12,13,14,  -1,-1,-1,18,21,  1,2); // R G B h v
  73.   vga.bufferCount = 2;
  74.   if(!vga.init(pins, mode, 8)) while(1) delay(1);
  75.   
  76.   vga.start();
  77. }
  78. void loop()
  79. {
  80.   while (true)
  81.   {
  82.     for (int i = 0; i < 180; i++)
  83.     {
  84.       HideSphere(200, 45 + i, 30 + i, 1);
  85.       vga.show();
  86.       delay(20);
  87.       vga.clear(0);
  88.     }
  89.   }
  90. }
复制代码

最终的效果还不错,有兴趣的朋友可以在下面看到:


这次使用到的库

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail