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

です。

ファイルの取得

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を追加。

これできっと実行できるはず。

Macports db46でエラーが出る。。。

gnuplotをインストールしようとしたらdb46でエラー。jni.hがみつからないとか出る。
どうもJava for MacOSX Version 3のシンボリックリンクがめちゃくちゃ(?)になってることが原因らしい。
version 2にダウングレードするか+no_javaをつけると通るみたい。

sudo port -v selfupdate
port clean db46
port install db46 +no_java

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;

なるほど!

QtGUIのメンバへのアクセスとスレッド

QtGUIのメンバの読み出しはGUIのスレッド以外からは読みだすとランタイムエラーになるらしい。
QThreadで定期的にダイアログの描画を他のダイアログから値をとりだして更新しようと思ったらおこられてしまった。
さてどうしたものか…。

slotsやsignalはQTで実装されたプログラムならいいけどQTに非依存のライブラリと関連付けられない(にくい?)のがめんどう。ラッパーかますのが普通なのかなぁ。

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を押すまでもとのダイアログのプロセスに戻らない。