キャラクターの3Dプリント

posted in: 3D Modeling, 3D Printing | 0

これまで鎖などの単純な構造は3Dプリントしてきましたが、キャラクターの3Dプリントは行ってきませんでした。

今回は、キャラクターの造形に対する3Dプリンターのポテンシャルを検証するため、キャラクターの3Dプリントを行ってみました。

印刷対象としたのはこちら↓

お腹部分はGAINENZのロゴを貼ってあります

このキャラのオリジナリティについてはあえて触れないことにします

この向きのままで3Dプリントしようとすると、爪あたりの造形をサポート材で支えるのが難しそうなので、下のような向きに設定します

このような向きであれば、爪の部分にサポート材がいりませんね

そこで印刷を行ってみます

3Dプリンタできちんと読み込めていることが確認できます

印刷は1時間程度で終わりました

印刷後のビルドプラットフォームは上の通りです

1発で印刷に成功しました

キャラクターが空を飛んでいるみたいでかわいいですね

やはり、サポート材をつけるポイントは、一番細かい部分にはサポート材を適用しなくて済むように全体の傾きを考えることだと思います

造形物の大きさはこちらの画像の通り、500円玉程度の大きさです

これほど小さくても、目の窪みといった細かな造形や爪部分、翼の骨格部分などの造形に成功できています

定量的には、大きさは下の通りです

高さは1.5 cm程度となっております

したがって、細かな造形に対しても有効なELEGOO社のMARS 2 PROでした

ジェネヴァ機構の3Dアニメーション

posted in: 3D Animation, 3D Modeling | 0

ジェネヴァ機構というギアが知られています。

これは連続回転運動を断続回転運動に変換するものです。

今回はその機構をBlenderによる3Dアニメーションで再現してみました。

作製したblendファイルのワイヤーフレームモデルはこちらの通り

こちらのサイトを参考に作らさせていただきました

オレンジ色で示したのはギアに対応するボーンです

回転という単純な動きしかしないため、1本のボーンで構成されています

6回対称性を有するジェネヴァ機構になっておりますので、連続回転機構の1回転がジェネヴァ機構としての1/6回転に対応します。

近いうちに、こちらの構造を3Dプリントすることによって、その挙動を確認できると思います。

9/29追記:実際に3Dプリントしました

柔軟構造の3Dプリント

posted in: 3D Modeling, 3D Printing | 0

前回は3Dプリントによってテンセグリティ構造の基本骨格部分をつくりましたね

しかし、ヒモの部分はプリントできませんでした

(代わりに私の髪の毛を使いました。バイオマテリアルってすげえ)

なぜプリントできないかと言うと、それは当然、プリント後の造形物はヒモのように柔軟でないからです

テンセグリティ構造の全てを3Dプリントしたければ、ヒモのように柔軟な構造を3Dプリントする必要があります

剛直な材料を使いつつも、ヒモのような柔軟さが求められる…となると行きつく先は鎖型構造です

ヒモ部分を鎖型構造にしてもテンセグリティ構造は成り立つはずです

そこで、今回は3Dプリントで鎖構造をつくりました

①ファーストトライ

結論から言うと、一回目のプリントは小さすぎてうまくいきませんでした

作製したモデルはこの通りの長さです

一番大きいもの以外、造形すらできませんでした

一番大きい鎖ですら、鎖同士でくっつきあってて柔軟な構造になっていません。失敗です

chain-fail
chain-fail

②セカンドトライ

というわけで、鎖を少し大きくモデリングしなおしました

あと、鎖のわっかが互いにくっつきあいにくいように、正円の形に少し近づけました(↓)

一番大きいものの全長は10 cm程度です

印刷時間は55 分でした。お手軽ですね

このように、構造がビルドプラットフォームにしっかりとついていることが確認できます

上下の向きを正しくしてみると、どの大きさの鎖もうまくできていそうなことが分かります

あとは、サポート材をとりはずすのみです

完成です。柔軟な振る舞いを示すことも確認できました

ちなみにこのような鎖構造、化学用語でいうとカテナンっていいます。

カテナンが何個も連なっているということで、ポリカテナンとも言いますね

本当は1分子で鎖構造のときをカテナンといいますが、これも重合によって1分子になっているようなものなのでカテナンでいいですね(怒られそう)

次回から、テンセグリティ構造のモデルにどうやってこの構造を組み入れるかということを考えていきます

悪天候を星空に変えるインタラクティブシステム

posted in: Processing | 0

下の画像の空部分をクリック(もしくはタップ)してみてください

星が出現します

一方で、空以外をクリックしても星は出現しません

本プログラムは、東大学際情報学府のメディアアートの授業で、私の最終課題として提出したものです

コンセプトありきの内容となっておりますので、これの作製方法と合わせて、以下にそれを示します

【コンセプト】

 ディズニーランドは、日常とはかけ離れた体験が楽しめる場所として知られている。ランド内には最新の技術や設備が用いられることによって、人々を主に視覚的に楽しませるためのメディアアートが数多く取り入れられている。その一例が、プロジェクションマッピングである。図1に示した例では、シンデレラ城をスクリーンとしてアニメーションが投影されている。このような表現手法によって、ディズニーランドならではの圧倒的スケールかつダイナミックな表現が可能となる。シンデレラ城に投影されたアニメーションは、多くの人々のカメラによって画像や動画形式で保存・再利用されることで、宣伝に用いられるだけでなく、人々の思い出に残るという重要な機能を果たす。しかしながら、このような画像・動画ファイルの5割近くの画素データは空の情報であり、全体の雰囲気を左右する重要なファクターでありながらも、プロジェクションマッピングでは制御できないという問題がある。したがって、空模様が悪天候であれば、5割近い画素数に対応する魅力を失うこととなり、画像全体の印象を低下させる要因につながる。

図1. プロジェクションマッピングの撮影例. バックグラウンドは必然的に空となる.

 以上のような問題を解決するため、本提案では「悪天候を星空に変えるインタラクティブシステム」を示す。本提案で設計するシステムでは、画像全体の印象の決定において重要である空の画像情報を、煌びやかな星空の画像情報に修正することで、画像全体の印象を向上させることを目指す。加えて、修正位置・タイミングはその都度自由に制御できるようにプログラムしておくことにより、空情報をオンデマンドで改善できるシステムの創製を実現する。

【設計】

 読み込んだ背景画像の空領域においてのみ、クリックによって瞬く星を出現させることができるプログラムを設計した。出現させた星は、空の領域においてのみ落下し、地表に到達すると消失する。このようなダイナミックな星空の表現によって、静止画像では不可能なレベルで画像全体を活き活きと表現することが可能になる。加えて、悪天候時の空の色はRGB値の範囲によって定義しておく。これによって、背景画像の変更やカメラからのリアルタイムな画像入力を行ったとしても、同様の機能が一つのプログラムで再現可能となる。以上を実現するプログラムは(1)から(5)に示される5つの部分から構成される。以下ではそれぞれについて説明する。

(1)では変数を定義する。撮影した画像が代入されるimgと、星の画像が代入されるstar1を定義する。マウスの位置はx1とy1で定義し、出現させる星のx座標、y座標はzure、y2で定義する。複数の星を出現させられるように、星はshineという可変配列(ArrayList)として宣言しておく。

(2)では画像の表示サイズの決定と画像の読み込みを行う。disney.jpgは図2に示すように、2020年5月1日に撮影した悪天候時のシンデレラ城である。Star.pngは出現させる星の画像である(図3)。

(3)ではフレーム毎の背景画像の表示と、マウスのx座標の取得、星の出現の制御を行う。image()で背景画像を毎フレーム読み込むことで、落下する星によって背景が上書きされることを防ぐことができる。変数zureにはマウスのx座標を毎フレーム代入することで、追加する星のx座標がマウス位置で意図した通りとなる。for文を用いることで、iの数に対応した星の数を出現させることができ、同時にresetMatrix()によって異なる複数の星の座標を初期化できる。

(4)ではクリックによって起きる動作を決定する。x1とy1はマウスの位置であり、クリックによって出現させる星の初期位置となる。x1とy1の箇所におけるRGB値はc3に代入する。このc3の値がif文で指定した空の色である場合のみ、星の出現を意味するshine.add(new Shine())が可能となる。星のy座標はその後変化するため、その位置を意味するy2にもマウスのy座標を代入しておく。

(5)では星の座標の制御を行うためのクラスを記述する。星のx座標には、zureと等しい値だけ移動することを意味するidouが代入される。星のy座標であるy2は+1ずつ増大することをy2 += 1;として記述する。星のサイズはrandom()関数で25~30の値となるように設定し、瞬きを表現する。落下中の星の座標における色はc4に代入する。このc4のRGB値がif文で指定した空の条件と等しければ落下は続行され、空の条件でなければ落下は中断される。これによって、地表に到達した星の消失が起きる。

(1)PImage img, star1;
int x1, y1, y2;
float zure;
ArrayList shine = new ArrayList();
 
(2)void setup(){  
size(806, 605);
img = loadImage(“disney.jpg”);
star1 = loadImage(“Star.png”);
}
 
(3)void draw(){
image(img, 0, 0, width, height);
zure = mouseX;
for(int i = 0; i < shine.size();i++){
resetMatrix();
Shine b = (Shine)shine.get(i);
if(b.draw(i) == false){
shine.remove(i);
}
}
}
 
(4)void mousePressed(){
x1 = mouseX;
y1 = mouseY;
y2 = mouseY;
color c3 = get(x1, y1);
if(red(c3)<120 & 5<red(c3)& green(c3)<120 & 25<green(c3) &blue(c3)<120 & 30<blue(c3) & green(c3)-red(c3) < 25 & green(c3)-red(c3)>0) shine.add(new Shine());
}
(5)class Shine{
float y2 = mouseY;
float idou = zure;
boolean draw(int c){
translate(idou,10);
float size = random(25,30);
image(star1, – size /2, y2- size /2, size, size);
y2+= 1;
color c4 = get(int(idou), int(y2)+int(size));
if(red(c4)<120 & 5<red(c4)& green(c4)<120 & 25<green(c4) &blue(c4)<120 & 30<blue(c4) & green(c4)-red(c4) < 25 & green(c4)-red(c4)>0){
return(true);
}else{
return(false);
}
}
}
図2. disney.jpgの内容.
図3. star.pngの内容

【体験の仕方】

1.Processingの再生ボタンを押す。

2.表示される画像の任意の領域をクリックする。空をクリックすると星が降り始め、空以外をクリックすると何も起きない。

3.クリックした位置において星が出現し、その後落下する様子を見守る(図4)。

図4. 出力結果