イラスト
processingによるデジタルアート作品
使用ソフト:processing
制作期間:2 カ月
微生物を生成するプログラム
processing を使用しランダムに微生物を生成するプログラムを作成。
ボルボックスやアメーバを再現しました。
以下ソースコード(Processing4.2、4.3で実行を確認 そのままコピーペーストで実行できます)
Borubox[] borubox;
Tubutubu[] tubutubu;
Cell[] cell;
Ameba[] ameba;
Hosonaga[] hosonaga;
int nboru=3;
int ntubu=10;
int ncell=15;
int nameba=3;
int nhosonaga=10;
//float boru_x[]=new float[nboru];
//float boru_y[]=new float[nboru];
void setup() {
size(1500, 1000);
colorMode(RGB, 255, 255, 255, 100);
borubox=new Borubox[nboru];//////ボルボ
for (nboru=0; nboru<3; nboru++) {
float rscale=2;
float c=100;
borubox[nboru]=new Borubox(rscale, c);
}
tubutubu=new Tubutubu[ntubu];/////粒粒
for (ntubu=0; ntubu<10; ntubu++) {
tubutubu[ntubu]=new Tubutubu();
}
cell =new Cell [ncell];//////細胞
for (ncell=0; ncell<15; ncell++) {
cell[ncell]=new Cell();
}
ameba=new Ameba[nameba];//////アメーバ
for (nameba=0; nameba<3; nameba++) {
ameba[nameba]=new Ameba();
}
hosonaga=new Hosonaga[nhosonaga];/////細長
for (nhosonaga=0; nhosonaga<10; nhosonaga++) {
hosonaga[nhosonaga]=new Hosonaga();
}
}
void draw() {
background(220, 220, 210);
for (nboru=0; nboru<3; nboru++) {//////ボルボ
borubox[nboru].drawBorubox();
}
for (ntubu=0; ntubu<10; ntubu++) {/////粒粒
tubutubu[ntubu].drawTubutubu();
}
for (ncell=0; ncell<15; ncell++) {/////細胞
cell[ncell].drawCell();
}
for (nameba=0; nameba<3; nameba++) {/////アメーバ
ameba[nameba].drawAmeba();
}
for (nhosonaga=0; nhosonaga<10; nhosonaga++) {/////細長
hosonaga[nhosonaga].drawHosonaga();
}
noStroke();/////////////////////////////////////////////ノイズ粒粒
for ( int noi=0; noi < 1000; noi++ ) {
fill(20,100,15,random(10,50));
circle(random(width), random(height),random(1,4));
}
stroke(20,60,15,random(40,100));
strokeWeight(1);
for ( int dot=0; dot < 4000; dot++ ) {
point(random(width), random(height));
}
}
class Hosonaga{///////////////////////////////////////////以下細長
float kosuu=random(5,15);
void drawHosonaga(){
pushMatrix();
translate(random(width), random(height));
rotate(random(PI/2));
strokeWeight(12);
stroke( 30,120,20,random(10,50));
for (int sen=0;sen<kosuu;sen++){
float ax =random(-10,10)*cos(random(PI/5.5,PI/3.5));
float ay =random(20,30)*sin(random(PI/5.5,PI/3.5));
float cx =random(-10,10);
float cy =random(30,50);
float bx =random(-10,10)*cos(random(PI/6,PI/3));
float by =random(20,30)*sin(random(PI/6,PI/3));
bezier( 0, 0, ax, ay, cx-bx, cy-by, cx, cy );
translate((cx+bx)*0.95, (cy+by)*0.95);
rotate(random(0,PI/6));
}
popMatrix();
}
}//////////////////////////////////////////////////////以上細長
class Cell {///////////////////////////////////////////以下細胞
void drawCell(){
pushMatrix();
translate(random(width), random(height));
rotate(random(PI/2));
noFill();
stroke( 30,120,20 );
strokeWeight(0.3);
float cells=random(1,20);
for (int s=0;s<cells;s++){
float a=random(8,12);
float b=random(8,12);
float c=random(35,45);
float d=random(8,12);
float e=random(35,45);
float f=random(35,45);
float g=random(8,12);
float h=random(35,45);
//細胞同士の距離z
float z=(sqrt(sq(e-a)+sq(f-b))+sqrt(sq(c-g)+sq(h-d)))/2;
//細胞の中心の座標
float x=(sqrt(sq(e-a)+sq(f-b)))/2;
float y=(sqrt(sq(c-g)+sq(h-d)))/2;
pushMatrix();
translate(random(x,x+5),random(y,y+5));
for (int i=0;i<1000;i++){
float ar=(1-sqrt(random(359)));
float r=random(30);
float pointx=r*sin(ar);
float pointy=r*cos(ar);
point(pointx,pointy);
}
popMatrix();
beginShape();//曲線でつなぐ多角形
curveVertex( a, b );
curveVertex( c, b );
curveVertex( e, f );
curveVertex( g, h );
curveVertex( a, b );
curveVertex( c, b );
curveVertex( c, d );
endShape();
translate(0,z);
rotate(random(PI/-18,PI/18));
}
popMatrix();
}
}///////////////////////////////////////////以上細胞
class Tubutubu {///////////////////////////////////以下粒粒
float r=10;
float tubus=random(20,100);
void drawTubutubu() {
pushMatrix();
translate(random(-500,width), random(-300,height));
rotate(random(PI/4));
fill(50, 120, 40, random(30, 50));
for (int x=0; x<tubus; x++) {
float k=random(-0.8, 0.8);
float p=2*r*cos(k);
float q=2*r*sin(k);
translate(p, q);
noStroke();
circle(0, 0, 2*r);
}
popMatrix();
}
}////////////////////////////////////////////////////以上粒粒
class Borubox {///////////////////////////////////////以下ボルボックス
float rscale;
float c;
float pointx=0.0;
float pointy=0.0;
float r=0;
float a=0;
float d=0;
Borubox(float r_scale, float _c) {
rscale= r_scale;
c=_c;
}
void drawBorubox() {
noStroke();
pushMatrix();
translate(random(width), random(height));
for (int i=0; i<=2000; i++) {
a=random(359);
r=200-random(random(random(200)));
pointx=r*sin(a);
pointy=r*cos(a);
fill(90, 150, 90, random(10, 70));
circle(pointx, pointy, 5);
noLoop();
}
for (int d=0; d<6; d++) {
pushMatrix();
stroke(40, 120, 40);
translate(random(-100, 100), random(-100, 100));
for (int s=0; s<=1000; s++) {
a=random(359);
r=50-random(random(random(50)));
pointx=r*sin(a);
pointy=r*cos(a);
point(pointx, pointy);
}
noStroke();
fill(90,140,70,15);
circle(0,0,100);
popMatrix();
}
popMatrix();
}
}//////////////////////////////////////////////////以上ボルボックス
class Ameba{///////////////////////////////////////以下アメーバ
void drawAmeba() {
noStroke();
pushMatrix();
translate(random(-400,width), random(-400,height));
float[] mx = new float[30];//各メタボールのX座標を保持する配列
float[] my = new float[30];//各メタボールのY座標を保持する配列
float[] mr = new float[30];//各メタボールの半径を保持する配列
float d;
float ahannix=100;//範囲の起点
float ahanniy=100;
for(int ai=0; ai<30; ai++){
mx[ai]=random(ahannix,ahannix+random(300,600));
my[ai]=random(ahanniy,ahanniy+random(300,600));
mr[ai]=random(80, 200);//乱数で各メタボールを配置
}
for(int x=0; x<width; x++){ //画面の横幅分繰り返し
for(int y=0; y<height; y++){ //画面の高さ分繰り返し
d=0; //濃度の累積値を0(ゼロ)に設定
for(int ai=0; ai<30; ai++){ //メタボールの個数分繰り返し
float dis = sqrt(pow((mx[ai]-x),2) + pow((my[ai]-y),2)); //現在画素とメタボールの位置との距離を測定
if(dis < mr[ai]){ //距離がメタボールの半径未満であれば(現在画素はメタボールの中)
float dt = radians((dis / mr[ai]) * 180.0); //現在の距離を0度~180度までの値に変換
d += (cos(dt)+1.0)/2.0; //前行の値(dt)をコサインの関数で0.0~1.0の分布に直して累積加算
}
}
stroke(15,75,25,100/d);
if(d >= 0.7){ //得られた濃度値(d)が0.2~0.3の範囲内であれば
point(x, y); //現在の画素(x,y)で点を描画
}
}
}
stroke(25,75,35);
for (int k=0;k<15;k++){//小さい丸
for (int s=0;s<=1000;s++){
float a=random(359);
float r=k*1.5-random(random(random(k)));
float pointx=mx[k]+r*sin(a);
float pointy=my[k]+r*cos(a);
point(pointx,pointy);
}
}popMatrix();
}
}//////////////////////////////////////////////////以上アメーバ
int count=6;
void keyPressed(){
if(keyCode == ENTER)
{
save("cells_n"+count+".png");
count++;
}
}
二次創作
立体作品
3DCG作品
使用ソフト:Maya, CLIP STUDIO PAINT, Illustrator,Substance 3D Painter
制作時間: 約130時間( 2024 年1 ~ 4 月)
ポリゴン数: 40698(キャラクターのみ)
宇宙開発が進み、科学技術が更に発展し
宇宙をエンタメとして取り扱うレポーターが登場した架空の世界を想定し
オリジナルキャラクターをデザイン、モデリングしました。
宇宙を股にかける探検家兼レポーター。
より多くの場所を探検するため、複数体の
人形を分身として操作し宇宙各所に赴く。
▲今日の宇宙ニュース!ライブ配信
▲三面図
宇宙中を探検するキャラクターであるため、
宇宙服の意匠を取り入れて鮮やかな青紫色を基調に明るくポップなデザインにしました。
各地を探検・レポートして回る好奇心旺盛な性格を想定し、
丈が短く動きやすい服装に加え様々な角度から撮影しても映えるよう
各所に装飾等を散りばめました。
膝の球体関節と管を満たす星雲がチャームポイント。
あくまでも人工の人形であるという点と宇宙(科学)がモチーフという点を鑑みて、
ヘッドセットや靴などの人工部分でウサギ要素を盛り込みました。
←▲こだわりポイント・うさぎ足風ブーツ! ▲こだわりポイント・ステッカー達→
▲ワイヤーフレーム
▲表情差分
▲表情差分・ワイヤーフレーム
▲コンセプトアート
▲ラフデザイン
使用ソフト:Maya
制作期間: 3 カ月 ( 2023 年 10 ~ 12 月 )
3年後期ゼミにおける研究です。
生物のロコモーション(移動行動)を観察し、
独自に6 本足のクリーチャーのモーションを考案しました。
主に有蹄類と食肉目の動物を基として研究を進めました。
3dcg によるクリーチャー表現を探究するため、
現存する動物から逸脱した形状のクリーチャーの移動行動を
生物学の面から体系的に模索するという取り組みを行いました。
犬をベースとした食肉目の6本足クリーチャーを想定し、
骨の動きに注目するために骨のみのモデルを制作し使用しています。
▲最終成果映像
▲動物種による移動行動の違いについて(最終成果映像の一部)
▲実際の展示風景