使用Processing和PixelFlow库创建交互式流体太极动画

使用Processing和PixelFlow库创建交互式流体太极动画

  • 引言
  • 准备工作
  • 效果展示
  • 代码结构
  • 代码解析
    • 第一部分:导入库和设置基本参数
    • 第二部分:流体类定义
      • `MyFluidDataConfig` 类详解
      • `MyFluidData` 类详解
      • `my_update` 方法详解
      • 流体类定义完整代码
    • 第三部分:太极类定义
      • 太极类定义完整代码
    • 结语

引言

本教程将指导您如何使用Processing编程环境结合PixelFlow库来创建一个交互式的流体太极动画。PixelFlow是一个基于GPU的实时图形库,它提供了高效的流体模拟功能。我们将通过麦克风输入的音频振幅来驱动流体模拟,并在流体之上绘制一个动态的太极图案。

本章项目代码的获取方式:去公主号【帅小柏】,回复【008】获取喔

准备工作

  1. 安装Processing:访问Processing官网下载并安装Processing IDE。

  2. 导入DwPixelFlow库:在Processing中,通过菜单"Sketch" -> “Import Library…” -> “Add Library…”,搜索并安装DwPixelFlow库。

  3. 导入声音库:同样地,搜索并安装Minim库,用于处理声音输入。

效果展示

什么?这个processing流体代码竟然免费开源送给大家!!

代码结构

我们的项目将包含以下几个主要部分:

  1. 设置窗口和基本参数:定义窗口大小、背景色和线条颜色。
  2. 声音输入设置:使用Processing的AudioInAmplitude类来获取麦克风输入的音频振幅。
  3. 流体模拟设置:初始化PixelFlow库,创建流体对象,并设置其参数。
  4. 太极图案设置:创建太极对象,并为其分配绘制层。
  5. 主循环:在draw函数中更新流体模拟和太极图案。

代码解析

第一部分:导入库和设置基本参数

import com.thomasdiewald.pixelflow.java.DwPixelFlow;
import com.thomasdiewald.pixelflow.java.fluid.DwFluid2D;import processing.core.*;
import processing.opengl.PGraphics2D;
import processing.sound.*;int viewport_w = 600; // 定义窗口宽
int viewport_h = 600; // 定义窗口高
color bg_color = #FFFFFF; // 背景色
color line_color = #000000; // 线条颜色DwFluid2D fluid; // 流体
PGraphics2D pg_fluid; // 流体层// 声音麦克风输入
AudioIn audioIn;
// 振幅-音量
Amplitude rms;Taichi taichi; // 太极
PGraphics2D pg_taichi;  // 太极图层
PGraphics2D pg_obstacles; // 障碍物
float taichi_radius = 100;void settings() {size(viewport_w, viewport_h, P2D);
}void setup() {background(bg_color);frameRate(60);// 设定声音setupSound();// 设置流体参数setupFluid();// 设置太极图setupTaichi();
}void setupSound() {audioIn = new AudioIn(this, 0);audioIn.play();rms = new Amplitude(this);rms.input(audioIn);
}void setupFluid() {// 初始化pixelflowDwPixelFlow context = new DwPixelFlow(this);context.print();context.printGL();// 流体模拟fluid = new DwFluid2D(context, width, height, 1);fluid.param.dissipation_velocity = 0.70f;fluid.param.dissipation_density  = 0.60f;fluid.addCallback_FluiData(new MyFluidData(rms));// 流体层pg_fluid = (PGraphics2D)createGraphics(width, height, P2D);// 障碍物层pg_obstacles = (PGraphics2D)createGraphics(viewport_w, viewport_h, P2D);pg_obstacles.smooth(4);
}void setupTaichi() {pg_taichi = (PGraphics2D)createGraphics(viewport_w, viewport_h, P2D);pg_taichi.smooth(4);taichi = new Taichi(new PVector(width / 2, height / 2), 100, pg_taichi, rms);
}void draw() {// 流体更新drawFluid();// 太极图drawTaichi();
}void drawFluid() {// 绘制障碍物drawObstacles();// 给流体增加障碍物fluid.addObstacles(pg_obstacles);// 流体更新fluid.update();fluid.renderFluidTextures(pg_fluid, 0);// 显示流体层image(pg_fluid, 0, 0);// 显示障碍物层image(pg_obstacles, 0, 0);
}void drawObstacles() {pg_obstacles.beginDraw();pg_obstacles.blendMode(REPLACE);pg_obstacles.clear();float x = width * 0.5;float y = height * 0.5;pg_obstacles.pushMatrix();pg_obstacles.translate(x, y);pg_obstacles.stroke(line_color);pg_obstacles.strokeWeight(2);pg_obstacles.noFill();pg_obstacles.circle(0, 0, 500);pg_obstacles.popMatrix();pg_obstacles.endDraw();
}void drawTaichi() {pg_taichi.beginDraw();pg_taichi.blendMode(REPLACE);pg_taichi.clear();pg_taichi.pushMatrix();taichi.display();pg_taichi.popMatrix();pg_taichi.endDraw();image(pg_taichi, 0, 0);
}

第二部分:流体类定义

  1. MyFluidDataConfig 类:用于配置流体运动的参数,比如圆的位置、半径、运动的角度和速度以及颜色等。

  2. MyFluidData 类:实现了 DwFluid2D.FluidData 接口,用于更新流体物理仿真的状态,同时整合声音输入作为流体动态变化的一部分。

  3. my_update 方法:是流体物理仿真更新的核心,它计算流体粒子的速度和位置,并且将这些数据传递给流体库来模拟流动。

现在,让我们进一步分析并解释每个部分的作用以及如何操作。

MyFluidDataConfig 类详解

这个类定义了流体仿真所需要的一些配置参数。例如:

  • x, y: 圆心位置。
  • radius: 半径。
  • isClockwise: 定义旋转方向。
  • angleSpeed: 角速度。
  • rx, ry, prx, pry: 当前和之前的位置坐标。
  • angle: 当前角度。
  • c: 颜色。

MyFluidData 类详解

此类使用 MyFluidDataConfig 中定义的配置来创建两个配置对象 config1config2。它们负责控制流体仿真中两个独立的流动体的行为。此外,它接收一个Amplitude对象(rms),它可能用于分析音频信号并将其影响应用于流体动画。

my_update 方法详解

这个方法是每一帧都会调用的,用于更新流体的状态。步骤如下:

  1. 使用极坐标计算弧上点的位置。
  2. 随机量产生抖动,使流动效果更自然。
  3. 计算速度,并根据是否顺时针调整y轴速度。
  4. 将计算的位置和速度用来更新流体对象的状态。
  5. 根据声音级别调整流体密度的半径大小。
  6. 添加颜色和密度到流体中。

流体类定义完整代码

public class MyFluidDataConfig {float x;  // 圆心位置xfloat y; // 圆心位置yfloat radius = 100; // 半径boolean isClockwise; // 是否是顺时针float angleSpeed = 0.04;float rx, ry, prx, pry; // 圆周运动,弧上的点位置,以及上一帧的点位置float angle = 0; // 角度color c; // 颜色
}public class MyFluidData implements DwFluid2D.FluidData {MyFluidDataConfig config1;MyFluidDataConfig config2;Amplitude rms;MyFluidData(Amplitude rms) {this.rms = rms;float x1 = width * 0.5;float y1 = height * 0.5;config1 = new MyFluidDataConfig();config1.x = x1;config1.y = y1;config1.radius = 130;config1.isClockwise = true;config1.angleSpeed = 0.05;config1.c = color(0.0, 0.0, 0.0);config1.angle = PI / 2;config2 = new MyFluidDataConfig();config2.x = x1;config2.y = y1;config2.radius = 130;config2.isClockwise = true;config2.angleSpeed = 0.04;config2.c = color(0.0, 0.0, 0.0);config2.angle = - PI / 2;}void my_update(DwFluid2D fluid, MyFluidDataConfig config) {float vscale = 14;float soundLevel = rms.analyze() * 1000;float delta = random(-3, 3);// 极坐标下计算弧上点的位置,用一个随机量进行抖动config.rx = config.x + (config.radius + delta) * cos(config.angle); config.ry = config.y + (config.radius + delta) * sin(config.angle);// 计算速度float vx = (config.rx - config.prx) * vscale;float vy = (config.ry - config.pry) * vscale;// 顺时针的话,需要乘以-1,因为y轴相反if (config.isClockwise) {vy = (config.ry - config.pry) * (-vscale);}float px = config.rx;float py = config.ry;// 顺时针的话,需要乘以-1,因为y轴相反if (config.isClockwise) {py = height - config.ry;}// 给流体上的点添加速度fluid.addVelocity(px, py, 16, vx, vy);float radius1 = map(soundLevel, 10, 600, 15, 20);float radius2 = map(soundLevel, 10, 500, 8, 12);println(soundLevel, radius1, radius2);// 给流体上的点添加密度,颜色为c,半径为radius1,稍微大点fluid.addDensity(px, py, radius1, red(config.c) / 255.0, green(config.c) / 255.0, blue(config.c) / 255.0, 1.0f);// 给流体上的点添加密度,颜色为白色,半径为radius2,稍微小点fluid.addDensity(px, py, radius2, 1.0f, 1.0f, 1.0f, 1.0f);//fluid.addTemperature(px, py, 30, 10);// 现在终将成为过去config.prx = config.rx;config.pry = config.ry;// 增加弧度角,用于下一帧计算,才能旋转float angleSpeed = constrain(radians(soundLevel * 0.03), 0.01, 0.08) * 3;println(soundLevel, angleSpeed);config.angle += angleSpeed;}@Overridepublic void update(DwFluid2D fluid) {my_update(fluid, config1);my_update(fluid, config2);}
}

第三部分:太极类定义

太极类定义完整代码

class Taichi {PVector location;float radius;PGraphics2D pg;float angle = 0;Amplitude rms;  Taichi(PVector location, float radius, PGraphics2D pg, Amplitude rms) {this.location = location;this.radius = radius;this.pg = pg;this.rms = rms;}void display() {float d = 2 * radius;float soundLevel = rms.analyze();angle += TWO_PI/360 * soundLevel * 20+6;pg.noStroke();pg.translate(location.x, location.y);  // 平移坐标系,方便使用相对位置进行绘制pg.rotate(angle);pg.fill(0);pg.arc(0, 0, d, d, PI / 2, PI * 3 / 2);pg.fill(255);pg.arc(0, 0, d, d, -PI / 2, PI / 2);pg.fill(255);pg.circle(0, d / 4, radius);pg.fill(0);pg.circle(0, -d / 4, radius);pg.fill(0);pg.circle(0, d / 4, radius / 5);pg.fill(255);pg.circle(0, -d / 4, radius / 5);}
}

结语

通过本教程,您将学习到如何结合Processing的声音输入和PixelFlow的流体模拟功能,创建一个动态的太极动画。您可以根据自己的创意进一步扩展这个项目,例如添加更多的交互元素或改变流体的行为。记得在编写代码时保持耐心,实践是学习编程的最佳方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找数字-算法

解法一、数位模拟 比n大的最小数就是n1,当n1时,以下几种情况会导致n中1的个数发生变化(或者不变) 1.n的低位连续1的个数count>1,如1011,10111,1111等,加1后使得n中1的个数减少count-1个 解…

基于SVPWM的飞轮控制系统的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM的飞轮控制系统的simulink建模与仿真。SVPWM的核心思想是将逆变器输出的三相电压矢量在两相静止坐标系(αβ坐标系)中表示,通过控…

Python3 数据类型详解:掌握数据基石,编写高效程序

Python3 中的基本数据类型包括整数(int)、浮点数(float)、布尔值(bool)、字符串(str)、列表(list)、元组(tuple)、集合(se…

JAVA static注入 Util使用之Service注入

一般在Util等静态方法中调用Service或mapper,初始化后会出现空指针异常:java.lang.NullPointerException。 代码执行优先级的问题,在一个Java类中,存在着静态代码块,静态方法,构造函数,成员方法等等。不同…

golang中的类和接口

类 在 Go 语言中并没有类的概念,而是使用结构体来实现面向对象的特性。通过 type 关键字可以定义自定义类型,包括结构体类型。下面是一个简单的示例: package mainimport "fmt"// 定义一个结构体类型 type Person struct {Name s…

只对外公开必要的信息和步骤

隐藏内部结构 使对象的内部结构对外部不可见的内容的处理被称为封装化。只公开方法等使用者所需要的最低限度的接口,使用者只能通过外部接口进行访问。如此一来,使用该类的程序就无须知道其内部的具体实现。 通过封装化,不仅可以防止调用者…

Node.js安装及环境配置(超详细!保姆级!!)

目录 一、进入官网地址下载安装包 二、安装程序 三、环境配置 四、测试 五、安装淘宝镜像 一、进入官网地址下载安装包 Node.js — Download Node.js (nodejs.org) 选择对应你系统的 node.js 版本,我选择的是Windows系统,64位 点击图中选项&#…

无人机+应急通信:灾害现场应急通信车技术详解

无人机和应急通信车是灾害现场应急通信中的重要技术。无人机可以通过快速到达灾害现场,搭载高清摄像头、红外热成像仪、激光雷达等设备,对灾区进行实时监测和灾情评估,同时也可以通过搭载的通信设备,与指挥中心进行实时通信和数据…

APP逆向实现方式总览

方式一:硬核分析 梳理出参数的构造逻辑,代码还原算法 方式二:模拟执行 2.1 Frida-RPC 电脑调用已加载到手机内存中的方法,直接获取到结果 2.2 AndServer-RPC 安卓程序调用手机中的方法,最后暴露成HTTP服务供电脑…

✅什么是排他锁、共享锁、意向锁

共享锁 共享锁,又被称为读锁,是由读取操作所创建的一种锁。在此期间,其他用户可以同时读取数据,但在数据上未释放所有共享锁之前,任何事务均无法对其进行修改(即获取数据的排他锁)。 一旦事务…

202009青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 通过算式123122021120可将二进制1101 转为十进制,下列进制转换结果正确的是?( ) A :0b10转为十进制,结果是2 B :0d10转为十进制,结果是8 C :0x10转为十进制,结果是10 D :0o10转为十进制,结果是16 正确答案:A 试题解析: 第 2 题 【单选题】 语句flo…

基于Nios-II实现流水灯

文章目录 一、新建项目1、选择芯片2、Qsys设计2.1、点击Platform Designer2.2配置软核2.3其他设置 3、Quartus设计3.1添加原理图3.2添加qip文件3.3其他设置3.4驱动设置 4、Nios-II Eslipse设计参考 一、新建项目 使用的Quartus 18.0及以上版本 1、选择芯片 2、Qsys设计 2.1、点…

【AIGC调研系列】你好-GPT-4o

GPT-4o是OpenAI最新发布的一款人工智能模型,它具备处理和生成文本、音频和图像的能力。这个模型的特点是能够实时对这些不同类型的输入进行推理和响应,这使得它在多模态交互方面表现出色[1][2][3]。 GPT-4o的“o”代表“omni”,意味着它是一…

【复试分数线】综合性985历年分数线汇总(第四弹)

国家线和34所自划线 可以看作是考研上岸最最最基础的门槛。真正决定你能不能进入复试的还要看院线(复试分数线)!今天我将分析考信号的除C9、工科类985的其他7所985近三年复试分数线(不包括2024),大家可以参…

Azure IoT Hub是啥

1.概要说明 Azure IoT Hub是微软在物联网(IoT)领域提供的一款重要产品,为设备连接和管理提供了专业的解决方案。以下是关于Azure IoT Hub的详细介绍: 定义:Azure IoT Hub是一个专为连接和管理数百万台物联网设备而设计…

flutter开发实战-人脸识别相机使用

flutter开发实战-人脸识别相机使用 当需要拍摄的时候,需要检测到人脸再进行后续的操作,这里使用的是face_camera 一、引入face_camera 在工程的pubspec.yaml中引入插件 # 检测人脸face_camera: ^0.0.8iOS端需要设置相关权限 在info.plist文件中&…

如何按住ctrl滑动鼠标桌面图标大小不变

如何按住ctrl滑动鼠标桌面图标大小不变 采取以下步骤: 1、鼠标在电脑桌面空白处单击右键,然后在弹出的对话框最上面有个“查看”,点击“查看”出来的最上面有“大图标”“中等图标”“小图标”,根据自己的需要选择图标大小即可。…

网络安全快速入门(九)MySQL进阶操作

上一章我们了解了对表及库的基本增删查改操作,本章我们针对增删查改内容进行与一些拓展, 9.1字段修饰及数据类型 我们之前在创建表时用到的格式为: create table 表名 ( 字段名1 字段数据类型(数据类型长度), 字段名2 …

Pytorch学习-调整torchvision.models中模型输出类别数

假设你的类别只有10个,而torchvision.models中Vgg16的输出类别为1000,这时应该如何调整呢? 方法一,直接修改模型中类别的输出。 from torch.nn import Linear import torchvision import torchVgg16torchvision.models.vgg16(pre…

华为认证大数据是什么?华为认证大数据有用吗?

华为大数据是用来搜集整理大数据,提供解决方案的数据中心。华为大数据解决方案是华为公司推出的一种综合性云解决方案,主要针对广告营销、电商、车联网等大数据应用场景的云计算大数据方案,帮助企业用户构建大数据平台,解决企业的…