使用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.pswp.cn/diannao/12576.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12576.shtml
英文地址,請注明出處:http://en.pswp.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…

華為認證大數據是什么?華為認證大數據有用嗎?

華為大數據是用來搜集整理大數據,提供解決方案的數據中心。華為大數據解決方案是華為公司推出的一種綜合性云解決方案,主要針對廣告營銷、電商、車聯網等大數據應用場景的云計算大數據方案,幫助企業用戶構建大數據平臺,解決企業的…