toioに命を吹き込んでいきたいと思います
Hiroshi Takagiと申します。普段は組み込みエンジニアをやっています。
この記事は、以前作成した、Unityでtoioを動かすスクリプトを用いて、身の回りの生物(ヘビ)を作ってみた記事です。
開発の環境等は前回の記事を参考にしてみてください。
工作生物 ゲズンロイドとか、ウロチョロスってすごく愛嬌のある動きをしますよね。
何か愛嬌のあるものを作ってみたい!と思い、身の回りのものをtoioに模倣させてみようと決めました。
さて、何を作ろう
最初はR2-D2とか作れたらいいなぁと思ってLEGOを組み立ててみたんですが、
R2○2風につくりました pic.twitter.com/lTWOWHH3Uo
— Hiroshi Takagi (@TkgHrsh) December 7, 2019
なかなか思い通りに行きませんね。。
思ったよりもロボットの見た目とか動きとかを真似るのって難しいです。
そこで、ふと身の回りの動物たちを作ってみようと思い立ち、
なんとなぁく簡単にできそうかなヘビを作ろうと決めました。
要はくねくねすればいいんですよねw
ヘビの動きを作ってみた
とは言ってみたものの、動きをイメージして作るのは難しかったので、
まずはネット検索から始めたところ、こんな動画を見つけることができました。
https://www.youtube.com/watch?v=58aZnl9V2L0
東工大の教授さんが発見したヘビの動きで、サーペノイド曲線っていうらしいです。
向きをサイン波で動かしながら、進むのがポイントのようです。
公式とか調べるのは大変だったので、そのまま実装に入りました。
それで作成したコードがこちら
void Update()
{
timeout += Time.deltaTime;
if (timeout >= 0.05f)
{
timeout = 0f;
if(isMoving){
int speed = (int)Speed.GetComponent<Slider>().value;
int gain = (int)Gain.GetComponent<Slider>().value;
int times = (int)Times.GetComponent<Slider>().value * 5;
float direction = Mathf.Sin( 2.0f * Mathf.PI * (float)count/(float)(times) + 0.5f * Mathf.PI);
int diff = (int)((float)gain * direction);
int left = speed - diff;
int right = speed + diff;
Cube.GetComponent<CubeController>().Move(left, right, 100);
count++;
if(count >= times){
count = 0;
}
}
}
}
Unityの記述になっていますが、50msec間隔でsin関数で計算した向きからモーター指示を出しています。
speedとgainとtimesは後で調整できるように以下のようにUI上のデータから引っ張ってきています。
*ヘビのアイコンはイラストエイトさんのものを使わせていただきました。
動作させてみた結果がこちら
キューブに蛇の動きをさせてみた。サーペノイド曲線っていうらしい。 pic.twitter.com/1PyQYPVeR9
— Hiroshi Takagi (@TkgHrsh) December 8, 2019
いい感じですかね。あとは見た目を作成できれば完了です。
あとはLEGOで見た目を作るだけ
LEGO初心者の私には、LEGOでくねくねさせるイメージが全く湧かなかったのですが、
周りの方に聞いてみたところ、意外と基本的なパーツで作成することができました。
この白いフック形状のものと、黄色い穴あきのものを組み合わせて、お花で蓋をすれば完成です。
完成品がこちら
サーペノイドキューブ+LEGO pic.twitter.com/591NC4paJl
— Hiroshi Takagi (@TkgHrsh) December 21, 2019
どうですか?結構様になっていませんかね?
Unityとtoio、LEGOがあるおかげで、こんなにもすぐに動くヘビが作れてしまったことに驚きです。
#おわり
これからもtoioとLEGOの生き物シリーズを作っていきたいと思いますので、お楽しみに。
それではまた!(クリスマスまであと三日!)