Unityでケーキのロウソクの火(物理)を消してみた
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

Unityでケーキのロウソクの火(物理)を消してみた

2013-12-24 00:00
  • 2
  • 4

この記事は Unity Advent Calendar 24日目の記事です

メリークリスマス!!
みなさんリアル充実
してますか??


ということで、クリスマスといえばケーキですね!



ケーキと言えば、ロウソク! 



ロウソクといえば・・・・????





はじめに


どうもみなさんこんばんは!自称Oculus RiftエヴァンジェリストGOROman です。
Oculus Rift エヴァンジェリストということで Oculus Rift の記事を書こうと思ったのですが、Unity Advent Calendarで結構Oculus Riftネタが多かったのであえてハズしてみました。Oculus Rift ネタについては、Oculus Rift Advent Calendar 最終日(何故か大晦日)にスーパーウルトラ長文(原稿用紙 東京ドーム1個分)で書かせていただく予定です!


つくったもの

まずはUnityを使って作ったこの動画を御覧ください。





このロウソクの火はなんと超音波で消しています。




ではなくて





この装置を 星先生 にお借りしております。

これはなにか?というと超音波を3次元の空間に任意の強度で発射できます。
超音波というのは本来人間の耳に聞こえない周波数の音ですが、集束すると
特定の場所に力を発生することが出来るらしいです。ぶっちゃけよく知らないので興味がある方はググるか、星先生にtwitterで聞いてみてください。

このデバイス自体はもともとはUnityには対応しておりませんでしたが、CでシリアルポートのようにUSB経由で任意制御が出来るということで、Unity対応をマッハで3時間くらいでやってみました。(もともとデバイスドライバはわりと得意)

手順

1.DLLをつくる

Native DLLを作成します。
(Native DLLのロード機能は、現状 Unity Proでないと動きません)

これはフツーにCやC++でDLLを作るだけで基本OKです。
正直言えばC言語とか一生書きたくないのですが
今回はもともと提供されていたC APIのラッパーを用意しました。


#define PAUTD_EXPORTS (1)

#ifdef PAUTD_EXPORTS
#define _EXPORT __declspec(dllexport)
#else
#define _EXPORT __declspec(dllimport)
#endif


typedef unsigned int PAUTDHANDLE;

extern "C" {

// デバイスのオープン
_EXPORT void PAUTDOpen();

// デバイスのクローズ
_EXPORT void PAUTDClose();

// デバイスのリセット
_EXPORT void PAUTDReset();

// 超音波更新
_EXPORT void PAUTDUpdate();

// 座標変更
_EXPORT void PAUTDSetPosition( double x, double y, double z );

// 強度変更
_EXPORT void PAUTDSetPower( unsigned int power );

// 周波数変更
_EXPORT void PAUTDSetFreq( unsigned int freq );

// 超音波停止
_EXPORT void PAUTDStop();

};


DLL作成について多少触ったことあれば、めっちゃカンタンです。
ビルドして、.dll を用意します。今回は PAUTDPlugin.dll という名前にしました。


2.Unity側スクリプトを書く

作成したDLLの関数を呼び出すのもめっちゃカンタンです。
DLLImport( "DLLファイル名") というディレクティブを用いてロードするだけです)

using UnityEngine;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public class PAUTDDevice : MonoBehaviour {
// デバイスのオープン
[DllImport ("PAUTDPlugin")]
private static extern void PAUTDOpen();

// デバイスのクローズ
[DllImport ("PAUTDPlugin")]
private static extern void PAUTDClose();

// デバイスのリセット
[DllImport ("PAUTDPlugin")]
private static extern void PAUTDReset();

// 超音波更新
[DllImport ("PAUTDPlugin")]
private static extern void PAUTDUpdate();

// 座標変更
[DllImport ("PAUTDPlugin")]
private static extern void PAUTDSetPosition( double x, double y, double z );

// 強度変更
[DllImport ("PAUTDPlugin")]
private static extern void PAUTDSetPower( System.UInt32 power );

// 周波数変更
[DllImport ("PAUTDPlugin")]
private static extern void PAUTDSetFreq( System.UInt32 freq );

// 超音波停止
[DllImport ("PAUTDPlugin")]
private static extern void PAUTDStop();

  ・
  ・
  ・
  ・
  ・
  ・


3.実行

1の手順で用意した .dll をUnityのAssetsのPluginsフォルダにブチ込みます。
イイカンジのスクリプトをサクっと書いて呼べばOK!

C#でザックリ使用例を書くとこんなイメージでしょうか?


// Update is called once per frame
void Update () {

  // オブジェクトのローカル位置を取得

  Vector3 pos = transform.localPosition;

  // 超音波指定 発射!!!!
  PAUTDDevice.SetPosition( pos );

}



超音波は3軸の座標で任意の位置へ出すことが出来ますので、これをUnityから制御します。
ミクさんは MMD4Mecanim で召喚し、プロジェクターで投影しています。
首の動きは Mecanim LookAt (IK)を使用しています。
実はミクさん自体はリアルタイム制御していまして、Novint Falcon のジョイスティック(日本名 お楽しみ棒)で首を動かし、ボタンクリックで息を吹く(超音波発射)です。なのでなかなか生々しい動きになっていますが、ざんねん!!実は私の手の動きです。ある意味モーションキャプチャですね。あと、風が吹いているように見える表現は、カメラとミクさんを同一階層にいれ、一気にZ軸を移動することでぶっ飛ばしています。あたかも風が物理計算で動いてるように見えるように工夫しました。
(応用すると風でスカートめくらせれます)

ちなみにこのアプリは開発期間は1日です。Unityがなかったら1億6000万光年くらいかかっていたので恐ろしい開発効率です!

・・・いかがでしょうか?? 意外とカンタンにCで作ったDLLと連携が出来ることがお分かりいただけたかと思います。ちなみに Novint Falcon (主にTENGAの制御に使われる)のラッパーもこんなカンジで作られています。


まとめ

Unityはゲームエンジンからラピッドプロトタイピング(RPT)のための統合環境となりつつあると思います。ガジェットやデバイスを繋ぐハブという位置づけです。Oculus RiftLeap Motion をはじめ今後登場する STEM System や多くのガジェットが Unity を中核としてSDK提供をするでしょう。逆に Unity に対応しないガジェットは使って貰えなくなるかもしれません。 Arduino のようなハードウェアも Uniduino のようなアセットを使うことで Unity から制御出来ますし、今回書いたようにDLLによるプラグインのバインドで無限の可能性があります。
Unity は「ゲーム開発の民主化」を理念にあげていますが、Unityはもはやゲームの開発という枠を越え、デバイスハブとなり、今や次世代のパワーポイントになるでしょう。従来の企画書やパワーポイントでは表現できなかったゴールをUnity上でラピッドプロトタイピングしてしまい、プレゼンを行うといった未来を予見できますし、Oculus Rift との併用でゲームだけでなく「製造業・建築業・不動産業・教育」といったゲーム以外の分野にも浸透していくことが予想されます。

C++ で DirectX でゲームをつくろうとして挫折した学生の皆さんや、週末プログラマな方々などこれを機会に是非一度Unityを触ってみてはいかがでしょうか??

さいごに

さて以下宣伝です。

ゲームプログラミング未経験の主婦がUnityでゲームを作る企画をやっております。
よろしければこちらもご覧ください。

主婦ゆに!




広告
×
光年は時間じゃなくて距離の単位ェ・・・
48ヶ月前
×
>>1
あえて書いてるんだよ・・・だよな?
48ヶ月前
コメントを書く
コメントをするには、
ログインして下さい。