シャドウマップを用いた影描画について
シャドウマップを用いた影描画についてのメモ
基本的なことですが、思う所があり、メモしておく。
シャドウマップの大きさ、描画範囲も大事だけど、深度の範囲の考慮も大事。
■ライトカメラ空間に適応する射影行列について
パースペクティブ (透視投影) 射影行列を使う方法と正射影を使う方法がある。
パースペクティブ (透視投影) 射影行列:
ライトの位置に光源を配置した時にできる広がりのある影が描画される。
シャドウマップテクスチャに書き込まれる深度値は、非線形なので、シャドウマップの影判定は、ライトカメラに近いオブジェクトと遠いオブジェクトがある場合、近いオブジェクトの方が精度が良くなる。
正射影行列:
平行光によってできる、広がりのない影が描画される。
シャドウマップテクスチャに書き込まれる深度値は、線形なので、シャドウマップの影判定は、ライトカメラに近いオブジェクトと遠いオブジェクトがある場合、判定精度に変化はない。
■綺麗な影を描画するために必要なことについて
・描画対象のオブジェクトをシャドウマップテクスチャに無駄なく描画する必要がある。
⇒描画対象オブジェクトを包み込むAABBを計算し、計算したAABBの領域を描画可能な射影行列を定義すればよい。
・カメラに近いオブジェクト程、シャドウマップに大きく描画する必要がある。
⇒カスケードシャドウマップ、ライトスペース・パースペクティブ・シャドウマップ(LSPSM)を使用すればよい。個人的には、LSPSMより、カスケードシャドウマップの方が綺麗だと思う。
・シャドウマップテクスチャの深度の範囲について、無駄が無いように描画する必要がある。
⇒ライトカメラ空間におけるnear面、far面を1から1000とした場合に、500から1000の間にしかオブジェクトが存在しないと1から500までの深度の範囲が無駄になってしまう。深度の範囲が無駄になれば、影判定の精度が悪くなる。
VisualStudioExpress2012とDirectxメモ
「Visual Studio Express 2012 for Windows Desktop」と「DirectX」についてのメモ:
・DirectX11.1は、Expressでは利用できない。
・DirectX11は、利用可能。「Visual Studio Express 2012 for Windows Desktop」のSDKに含まれているので、別途SDKをインストールする必要はない模様。
・DirectX11のTutorialは、「新しいプロジェクト」>「サンプル」>「Visual C++」>「デスクトップ」>「Win32」>「Graphics and 3D」からダウンロードできた。
・DirectX11のTutorialをコンパイルした時にエラーが発生した。
原因は、以下の場所にDirectX SDK (June 2010)のパスを指定しているために競合が起こったため。パスを削除したらコンパイルエラーは解消された。
>「プロジェクトのプロパティ」→「C/C++」→「全般」→「追加のインクルードディレクトリ」
>「プロジェクトのプロパティ」→「リンカー」→「全般」→「追加のライブラリディレクトリ」
参考:
Unity3DとMikuMikuDance for Unityを使用してみて
Unity3Dの使い方を学ぶために「MikuMikuDance for Unity」を使用して、書籍「Unityではじめるゲームづくり」のサンプルプログラムにMMDモデルを適応してみました。
Unityでは、サンプルが豊富にあるので、サンプルを改造するだけで、それなりに見栄えのするゲームができそうです。
以下に、改造を行った過程をメモしておきます。
■Step1 Unityへの「MikuMikuDance for Unity」の適応
・「MikuMikuDance for Unity」をUnityに適応する。
※「MikuMikuDance for Unity」のソースはSVNから最新のソースを落としたほうがよい。コンパイルエラーが出る場合は、エラーにしたがってソースを修正する。
参考:
『テラシュールウェア [Unity3D]UnityでMMDを使う』
『「Miku Miku Dance for Unity」でPMDファイルのインポートをしてみた - 強火で進め』
■Step2 MMDモデルの用意
・表示したいモデルのPMDファイルを用意する。
■Step3 モーションファイルの作成
・MMDを使用して、モーションファイル(VMDファイル)を作成・用意する。
※いちばんここが大変。歩く、走る、かがむ、待機モーション等の簡単なモーションを作るのですが、簡単なモーションでも作るの難しいです…
・「MikuMikuDance for Unity」では、IKを使えないので、用意したモーションファイルがIKを使用している場合、IKをベイクする必要がある。
・IKのベイクには、「MikuMikuDance for Unity」のSVN上に存在する「MMDIKBaker」を使用すると良い。
※ベイクがうまくいかない場合は、MMDでうまくいかない箇所のIKモーションのキーを増やすなりして、IKの解が正しく収束するよう工夫すること。
参考:
『テラシュールウェア [Unity3D]UnityでMMDを使う Ik対応版(ベータ)』
■Step4 PMDファイルとVMDファイルのインポート
・PMDファイルとVMDファイルをインポートする。
※物理シミュレーションについて、PMDファイルのRigidbodyインポートによって作成される剛体の設定では、物理シミュレーションが正しく動作しない方が多いので(MMDの様に親オブジェクトが動くと子供オブジェクトが引っ張られる様な挙動をしない)、PMDファイルのRigidbodyインポートはしない方が良いと思う。
参考:
Step1と同じ。
■Step5 MMDモデルのSceneへの配置と設定
・インポートしたMMDモデルをSceneに配置して、サンプルプログラムのWidgetのプロパティ設定を見て、同じになるように設定する。
■Step6 その他要素の追加
・サンプルプログラムでは、キャラクターの操作が、ラジコン操作だったので、3人称視点の操作に変更しました。
参考:
UnityアニメーションキーフレームのPosition項目について
「MikuMikuDance for Unity」を使用してみて、Unityのアニメーションキーについて、気がついたことがあるので、メモしておく。
使用したUnityのバージョン:Version 4.0.0f7
■気がついたこと
あるボーンオブジェクトの各軸(x,y,z)のキーフレームに対して、1つもキーが打たれていない場合は、そのボーンオブジェクトのTransformプロパティの座標値(親空間から見た位置座標==子供のローカル空間から親空間へ写すための座標)が0キーフレームに適応される。
1つでもキーが打たれている場合、そのボーンオブジェクトのTransformプロパティの座標値は適応されない。
■上記のことより、わかること
ボーンアニメーションの一般的なプログラムでは、自分のローカル空間における変換(キーフレームで設定する変換)⇒親空間へ写す⇒親空間の変換……と行列処理を行うが、Unityでは親空間へ写す行列処理を行わないみたいなので、Unityのキーフレームを設定する段階で、親空間へ写す行列を加味したキーフレームを設定する必要がある。
■MikuMikuDance for Unity について
ダウンロードファイルとして提供されている、2013/01/20現在最新の
「mmd-for-unity-v1.1a-r114.zip (日付: 2012-08-27, サイズ: 126.1 KB) 」は、上記の内容が考慮されていないため、アニメーションさせると、中心がずれます。
SVN管理されている最新ソースでは、修正(MMDLoader\Private\MMDConverter.cs のCreateKeysForLocationメソッド)されているので、SVNから落としたほうが良いです。
Subversion設定メモ
SVNの設定をしたので、ブックマークメモを残す。
■Subversionのインストールの仕方/使い方
『WindowsでSubversionを使う:TortoiseSVNでバージョン管理 - SourceForge.JP Magazine : オープンソースの話題満載』
http://sourceforge.jp/magazine/08/08/29/0550232
『小山太郎.com » Blog Archive » Subversion TortoiseSVN でファイル管理(準備編)』
『小山太郎.com ≫ Blog Archive ≫ Subversion TortoiseSVNでファイル管理(利用編)』
『TortoiseSVNのインストールと設定』
http://www.gside.org/Gentoo/subversion/subversion_client.html
■Subversion環境のアップデートについて
『Subversion環境のアップデート(CollabNet Subversion 1.6.12→Win32Svn 1.6.15) ≪ テスターですが何か?』
■Subversionリポジトリのバックアップ方法
『Subversionリポジトリのバックアップ方法いろいろ - ぱせらんメモ』
http://d.hatena.ne.jp/pasela/20090206/svn_backup
■debugフォルダやobjフォルダ(ビルドによって生成されるファイル)を変更のチェック、コミット対象の一覧に表示させたくない場合
『ファイルやディレクトリの無視』
http://tortoisesvn.net/docs/nightly/TortoiseSVN_ja/tsvn-dug-ignore.html
Visual Studio 2010(C++)を使用する上での注意点
■64bitアプリケーションの作成
・構成マネージャーでプラットフォームをx64を選択する。(ない場合は新規作成する。)
⇒「プロジェクトのプロパティ>構成プロパティ>リンカー>詳細設定>対象コンピューター」が「MachineX64 (/MACHINE:X64)」となる。
参考:
『Visual Studio 2010で64bitアプリケーションを作成する(C++):航海日誌:So-netブログ』
http://develop-tom.blog.so-net.ne.jp/2011-04-16
『Visual C++ 2010 Expressで64bitコンパイル - torutkの日記』
http://d.hatena.ne.jp/torutk/20100927/p1
<SDKインストール時にエラーが出る場合の対応>
『luluciの -Windows SDK 7.1 のインストールでハマった』
http://luluci.blog44.fc2.com/blog-entry-117.html
『Microsoft Windows SDK for Windows 7 and .NET Framework 4』
※対応方法をまとめると以下の通り。
・「Visual c++ 2010 x86 Redistributable」と「Visual c++ 2010 x64 Redistributable」を削除する。
・SDKインストール時に「Microsoft Visual C++ Compilers 2010~」のインストール対象のチェックを外してインストール。
・インストール後、「Visual c++ 2010 x86 Redistributable」と「Visual c++ 2010 x64 Redistributable」を再インストールする。
■古いソリューションファイルの変換について
visualstudio 2008等の古いバージョンのソリューションファイルを2010のソリューションに変換した後、ビルドできないことがある。その場合に確認することを記述する。
・ソリューションに複数のプロジェクトが存在し、あるプロジェクトが他のプロジェクトを参照している場合(ライブラリのリンク)。以下を確認する。
1)「プロジェクトのプロパティ>構成プロパティ>リンカー>全般>ライブラリ依存関係のリンク」項目が、「はい」になっていることを確認する。
2)「プロジェクトのプロパティ>共通プロパティ>参照(R)」にリンクしたいプロジェクトの参照が正しく設定されているか確認する。
自分自身のプロジェクトが参照対象に含まれていないか確認する。含まれていたら、削除する。
削除しないと「エラー 370 error MSB4006: ターゲット "ResolvedXDCMake" で、ターゲット依存グラフに循環する依存関係が存在します。C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets 1410」のようなエラーが発生する。
3)「プロジェクトのプロパティ>共通プロパティ>プロジェクト参照のプロパティ>ライブラリ依存関係のリンク」が「true」になっているか確認する。
参考:
『技術メモ VisualStudio2010 依存関係の取り扱い』
Visual Studio 2010(C#)を使用する上での注意点
■プラットフォーム(x86, x64, AnyCPU)の設定について
visualstudioのプロパティ画面でPlatformTargetをx86に設定しても、「~~.csprojファイル」内では、AnyCPUのままの場合がある。この状態だと、実行時に「~~間違ったフォーマットのプログラムを読み込もうとしました。~~」の例外が発生する。これを解決するためには、「~~.csprojファイル」を直接編集する必要がある。
⇒
■プラットフォームの統一について
作成するアプリケーション、リンクするライブラリについて、プラットフォーム(x86, x64)は全て統一されている必要がある。
統一されていない場合、実行時に「間違ったフォーマットのプログラムを読み込もうとしました。 」旨の例外が発生する。
C#だけで、ライブラリを作る場合は、AnyCpuを使用しておけば、無難であるが、C++/CLIのライブラリ(dll)をリンクする場合、リンクするライブラリのプラットフォーム(x86, x64)を考慮して、統一する必要がある(SlimDXを使う場合とか)。
参考:
『間違ったフォーマットのプログラムを読み込もうとしました。 - のねの日記 - human brain programing』
http://d.hatena.ne.jp/none53/20100707/1278470575
『32 / 64bit 環境の取り扱い - SlimDX と C# で学ぶ DirectX』
http://mainori-se.sakura.ne.jp/slimdx/?page=32+%2F+64bit+%B4%C4%B6%AD%A4%CE%BC%E8%A4%EA%B0%B7%A4%A4
■.NET Frameworkの統一について
リンクするライブラリ、アプリケーションの.NET Frameworkのバージョンが違うと「混合モード アセンブリ~~」の例外が発生する。そのため、.NET Frameworkのバージョンを統一するようにした方が良い。
もしくは、以下の様にApp.configを編集すること。
参考:
『NKY-TECH. ソフトウェア開発部: .NET Framework 4.0で混合モードのアセンブリを読み込めない旨のエラー』
http://nky-tech-sdt.blogspot.jp/2010/02/net-framework-40.html
『オンラインマニュアル : 混合モード アセンブリは・・・(Visual Studio 2010)』