Amplify Motionを使ってみた。
オブジェクトモーションブラーに対応したプラグインです。。
https://www.assetstore.unity3d.com/jp/#!/content/4243
チュートリアル
https://www.youtube.com/watch?v=dTbIpNSHIBc
マニュアル
http://amplify.pt/unity/amplify-motion/manual/
プログラム側でオブジェクトを動的に生成する場合は明示的にブラー対象であることを明示する必要がありそう。
AmplifyMotionEffect.Instance.Register(gameObject);
対象リスト追加される。
しかしブラーされない・・・ブレイクポイントを打って調べてみるとどうもAmplifyMotionBase.csのCanRegisterではじかれるているようだ。
rendererがnullになっている。PrefabのInspectorでRendererを追加。(今回の場合はSkinned Mesh Renderer)
次に、FindValidTagで引数がnullがなっているっぽい。
if ( tag == "Opaque" || tag == "TransparentCutout" )以外ははじかれる。現状はTransparent
考えてみれば完全半透明はモーションブラー、ただしくいかないですよね。
ということでOpaqueかCutOffに切り替えるとうまくいった!
OpenEXRライブラリを使いたい
従来の8bit画像にくらべ、精度の高い(=half floatやfloat)画像をHDR画像(High Dynamic Range image)といいます。
拡張子が.hdrや.exrなどがそうなのですが、exrの読み書きにOpenEXRというライブラリがあるそうです。
http://www.openexr.com/index.html
今回はこのOpenEXRをC++で使おうという話。
ライブラリをバイナリとしては提供されていなくて自分でビルドする必要があります。readme.txt通りにやるとうまく行かず四苦八苦していたのですが、
http://www.fixstars.com/en/lucille/docs/dev/index.php/How_to_build_OpenEXR_libs_for_Win_64bit
にあるようにstatic libraryにしてビルドするとうまくlibが生成されるようになりました。
微妙にやることがいろいろあるのでひと通り作業をまとめます。
実行環境
- VisualStudio2012 Professional
- openexr-2.1.0
- ilmbase-2.1.0
- zlib-1.2.5
です。
ファイルの取得
- http://www.openexr.com/downloads.htmlからopenexr-2.1.0.tar.gz及びilmbase-2.1.0.tar.gzをダウンロードして解凍。
- http://www.winimage.com/zLibDll/index.htmlからソース(zlib125.zip)とバイナリ(zlib125dll.zip)をダウンロードして解凍。
IlmBaseについて
デフォルトではdll作成をする設定になっていますが、dll作成の場合には「Iex::MathExc::MathExc(char const *)の定義がない」などのエラーでコンパイルが通らないのでstatic libraryを生成するように設定を変更する。(dllでコンパイルが通った方はやり方教えてください。)
コード生成についてはzlibがマルチスレッドDLLなのでMDを設定しておきます。
以下の設定をDebug/Releaseの両方で指定。
- ilmbase-2.1.0\vc\vc8\IlmBaseにあるソリューションファイルIlmBase.slnを開く。
- [ビルド]-[構成マネージャー]を開き、ビルドのチェック項目をつぎの項目のみにする。
- Half
- Iex
- IlmThread
- Imath
- Halfプロジェクトのプロパティを開き、[構成プロパティ]-[C/C++]-[全般]-[追加のインクルードディレクトリ]に..\..\..\..\config.windowsを追加
- Half/IlmThread/Imathプロジェクトのプロパティを開き、[構成プロパティ]-[C/C++]-[プリプロセッサ]-[プリプロセッサの定義]から「OPENEXR_DLL」を削除
- Half/Iex/IlmTHread/Imathプロジェクトのプロパティを開き、[構成プロパティ]-[ビルドイベント]-[ビルド後イベント]-[コマンドライン]の内容を削除
- Debug/Releaseビルド
OpenEXRについて
- [ビルド]-[構成マネージャー]を開き、ビルドのチェック項目をIlmImf・IlmImfExampleのみにする。
- ソリューションエクスプローラー上でIlmImfプロジェクトを右クリック、追加で「openexr-2.1.0\IlmImf」内のヘッダとソースをすべて追加する。(標準だとすべて入っておらずリンクエラーが出る。)
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[ライブラリアン]-[追加の依存ファイル]に、Half.lib;Iex.lib;IlmThread.lib;Imath.lib;zlibstat.libを追加。
- 同じくIlmImfプロジェクトのプロパティで、[構成プロパティ]-[ライブラリアン]-[追加のライブラリディレクトリ]に「..\..\..\..\..\zlib125dll\staticx64」「..\..\..\..\..\ilmbase-2.1.0\vc\vc8\IlmBase\x64\release」を追加。(debug/releaseはコンフィギュレーションに合わせて変えてください。)
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[C/C++]-[プリプロセッサ]-[プリプロセッサの定義]から「OPENEXR_DLL」を削除
以上の操作で無事OpenEXRのstaticライブラリが生成されるはずです。
IlmImfExampleについて
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[C/C++]-[全般]-[追加のインクルードディレクトリ]に「..\..\..\..\IlmImf;..\..\..\..\config.windows;..\..\..\..\..\zlib-1.2.5;..\..\..\..\..\ilmbase-2.1.0\Imath;..\..\..\..\..\ilmbase-2.1.0\IlmThread;..\..\..\..\..\ilmbase-2.1.0\Iex;..\..\..\..\..\ilmbase-2.1.0\Half;..\..\..\..\..\ilmbase-2.1.0\config.windows;%(AdditionalIncludeDirectories)」を追加
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[リンカー]-[全般]-[追加のライブラリディレクトリ]に、「..\..\..\..\..\openexr-2.1.0\vc\vc8\OpenEXR\x64\Release;」を追加。
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[リンカー]-[入力]-[追加の依存ファイル]に、IlmImf.libを追加。
これできっと実行できるはず。
CPPLAPACK?CULA?
CPPLAPACKを導入する必要が出てきたのでサイトのメモ
http://bit.ly/iGD4ul
http://bit.ly/iuMhfv
でもCLAPACK使うよりはCUDA前提でCULAにしたほうが導入も実装も楽そうなんだが。
Kinectで取得できる体の部位
Kinectで取得できる部位は以下のとおり。
typedef enum XnSkeletonJoint { XN_SKEL_HEAD = 1,//頭 XN_SKEL_NECK = 2,//首 XN_SKEL_TORSO = 3,//胴 XN_SKEL_WAIST = 4,//腰 XN_SKEL_LEFT_COLLAR = 5,//左首 XN_SKEL_LEFT_SHOULDER = 6,//左肩 XN_SKEL_LEFT_ELBOW = 7,//左肘 XN_SKEL_LEFT_WRIST = 8,//左手首 XN_SKEL_LEFT_HAND = 9,//手 XN_SKEL_LEFT_FINGERTIP =10,//左指先 XN_SKEL_RIGHT_COLLAR =11, XN_SKEL_RIGHT_SHOULDER =12, XN_SKEL_RIGHT_ELBOW =13, XN_SKEL_RIGHT_WRIST =14, XN_SKEL_RIGHT_HAND =15, XN_SKEL_RIGHT_FINGERTIP =16, XN_SKEL_LEFT_HIP =17,//左おしり XN_SKEL_LEFT_KNEE =18,//左膝 XN_SKEL_LEFT_ANKLE =19,//左足首 XN_SKEL_LEFT_FOOT =20,//左足 XN_SKEL_RIGHT_HIP =21, XN_SKEL_RIGHT_KNEE =22, XN_SKEL_RIGHT_ANKLE =23, XN_SKEL_RIGHT_FOOT =24 } XnSkeletonJoint;
なるほど!
QT+VisualStudioでダイアログをつくってみる
QTをVisualStudioでプログラミングする方法は
http://www.ebatech.jp/archives/1499
を参考にした。
VisualStudioでQtDesignerを使ってダイアログを作る方法をメモする。
QTプロジェクトを作るとForm Filesに拡張子uiのファイルが生成される。このファイルはQTデザイナーでデザインできる物である。メインダイアログは予め出来ているが、新しくダイアログを追加する場合にどのようにするかをメモする。
Qt Designerで適当にデザインする
「Form Files」で右クリックし、「新しい項目の追加」からQt Formsを選び、選びたいベースを選ぶ。
ファイル名をここでは「TestDialog.ui」とする。
するとQtDesignerが起動する。適当にデザインし保存する。
次にVisualStudioに戻りビルドする。QtDesignerでつくっておいたuiファイルをもとにqmakeが実行されクラスファイルが生成される。
新しいダイアログのクラスを作る
qmakeによりGenerated Filesにui_TestDialog,h/cppが追加されていることがわかる。
新しいDialogのクラスをTestDialogとする。
この時以下のような実装をする。
//TestDialog.h #ifndef TEST_DIALOG_H #define TEST_DIALOG_H #include <QDialog> #include "ui_TestDialog.h" class TestDialog:public QDialog{ Q_OBJECT public: TestDialog(); ~TestDoalog(); protected: Ui::TestDialog ui; }; #endif//TEST_DIALOG_H
#include "TestDialog.h" TestDialog::TestDialog(QWidget* parent) :QDialog(parent) { ui.setupUi(this); } TestDialog::~TestDialog() { }
こんな感じにすればQt Designerでデザインしたダイアログを自分のクラスで使えるようになる。
あとはメインのDialogのメンバで
//へっだ TestDialog m_cTestDialog; //そーす m_cTestDialog.show();//exec()
みたいにすれば表示される。
show()は表示しっぱなし。execはアクティブウィンドウがそのダイアログに移りOKを押すまでもとのダイアログのプロセスに戻らない。