[Processing]ポリゴンで波を表現
13594 ワード
こんな
69行目の「stroke(255);」の時と「noStroke();」の2種類の映像
線が入ると正方形が連なってるのがわかりますね
手前から奥に向かって帯が揺れています
プログラム
Wavers.java
PShape Ball;
class SeaSell{
SeaSell prev; //位置をマネする対象
float x;
float y;
float z;
float siner = 0;
SeaSell(float x , float Z){
this.x = x;
z = Z;
}
void Draw(){
if(prev != null)y = prev.y;
else y += sin(siner += 0.05f);
vertex(x,y,z);
}
}
SeaSell sells[][] = new SeaSell[100][100];
void setup(){
size(1800,800,P3D);
frameRate(30);
Ball = createShape(SPHERE,100);
Ball.setTexture(loadImage("Ball.png"));
Ball.setStrokeWeight(0);
//Sea sellの間隔
int distribution = 15;
//波打つ帯を横に並べてる
for(int i=0;i<sells.length;i+=2){
for(int j=0;j<sells[i].length;j++){
sells[i][j] = new SeaSell(i * distribution -distribution,j * distribution); //位置登録
sells[i+1][j] = new SeaSell(i * distribution +distribution,j * distribution); //位置登録
}
}
for(int i=0;i<sells.length;i++){
for(int j=0;j<sells[i].length;j++){
if(j != sells[i].length-1){ //jが端じゃない時、同列の隣のセルをprevにいれる
sells[i][j].prev = sells[i][j+1];
}
else if(i != sells.length-1){ //jが端だけどiが端じゃない時、隣の列のセルを入れる
sells[i][j].prev = sells[i+1][j];
}
}
}
}
void draw(){
background(0);
lights();
perspective();
pushMatrix();
translate(5,0,-1500);
rotateX(-PI/6f);
fill(50,50,200);
//stroke(255);
noStroke();
for(int i=0;i<sells.length;i+=2){
beginShape(QUAD_STRIP); //帯状の波
for(int j=0;j<sells[i].length;j++){
sells[i][j].Draw();
sells[i+1][j].Draw();
}
endShape();
}
pushMatrix();
translate(sells[50][50].x,sells[50][50].y,sells[50][50].z);
translate(0,-30,0); shape(Ball);
popMatrix();
popMatrix();
}
簡単に解説
Wavers.java
PShape Ball;
class SeaSell{
SeaSell prev; //位置をマネする対象
float x;
float y;
float z;
float siner = 0;
SeaSell(float x , float Z){
this.x = x;
z = Z;
}
void Draw(){
if(prev != null)y = prev.y;
else y += sin(siner += 0.05f);
vertex(x,y,z);
}
}
SeaSell sells[][] = new SeaSell[100][100];
void setup(){
size(1800,800,P3D);
frameRate(30);
Ball = createShape(SPHERE,100);
Ball.setTexture(loadImage("Ball.png"));
Ball.setStrokeWeight(0);
//Sea sellの間隔
int distribution = 15;
//波打つ帯を横に並べてる
for(int i=0;i<sells.length;i+=2){
for(int j=0;j<sells[i].length;j++){
sells[i][j] = new SeaSell(i * distribution -distribution,j * distribution); //位置登録
sells[i+1][j] = new SeaSell(i * distribution +distribution,j * distribution); //位置登録
}
}
for(int i=0;i<sells.length;i++){
for(int j=0;j<sells[i].length;j++){
if(j != sells[i].length-1){ //jが端じゃない時、同列の隣のセルをprevにいれる
sells[i][j].prev = sells[i][j+1];
}
else if(i != sells.length-1){ //jが端だけどiが端じゃない時、隣の列のセルを入れる
sells[i][j].prev = sells[i+1][j];
}
}
}
}
void draw(){
background(0);
lights();
perspective();
pushMatrix();
translate(5,0,-1500);
rotateX(-PI/6f);
fill(50,50,200);
//stroke(255);
noStroke();
for(int i=0;i<sells.length;i+=2){
beginShape(QUAD_STRIP); //帯状の波
for(int j=0;j<sells[i].length;j++){
sells[i][j].Draw();
sells[i+1][j].Draw();
}
endShape();
}
pushMatrix();
translate(sells[50][50].x,sells[50][50].y,sells[50][50].z);
translate(0,-30,0); shape(Ball);
popMatrix();
popMatrix();
}
SeaSellという座標と隣のSeaSellを保持するクラスが等間隔で配置されます
動作は2通り
解説.java
if(隣のSeaSellが登録されてる){
隣のSeaSellの位置に向かって移動する
}
else{ //隣のSeaSellが登録されていない場合
上下に動く //←映像の一番右下で上下してるやつ
}
以前投稿した「[Processing]クリック点を保存してアート作品を描く」から参考に制御してみました
Author And Source
この問題について([Processing]ポリゴンで波を表現), 我々は、より多くの情報をここで見つけました https://qiita.com/NekoCan/items/52b858fea330f6257082著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .