Nanashi-softプログラマ専用PSSuite開発


◇PS Suite開発 -モデルデータ表示-

付属サンプルを使用してモデルデータ表示を行ってみます

サンプルは↓にインストールされています
C:\Users\Public\Documents\Pss\sample

BasicModelクラスのサンプルがあります
C:\Users\Public\Documents\Pss\sample\Model\BasicModelSample

ザッと見たところ,mdx形式ファイルを読み込んで表示している事がわかります
何も説明が無いのですが,一緒に Cellda(.dae)ファイルが入っていると言う事は,このファイルから変換したのだと予想できます

モデルデータ変換ツールは,名称的に↓コレだと予想できます
C:\Program Files (x86)\SCE\Pss\tools\ModelConverter
プラグインフォルダを見る限り,.dae,.fbx,.x,.xsiファイルから .mdxファイルが生成できるのだと思います
readme.txtとか見ても何も書いてありません(汗

どう見てもコマンドラインツールですので,バッチファイルを作ります
・変換.batなどの名称で以下のコマンドを保存
ModelConverter.exe モデルデータのファイル名

ココでは,東方月地人より,綿月依姫データを使用してみます
○東方projectモデルデータ
http://comoesta.ferio.net/TOUHOU/TOUHOU.htm

この中から以下のファイルを,ModelConverter.exeと同一フォルダにコピーします
収録されているモデルデータの YORI_COLLADA.dae
TEX_QUARTERフォルダに下にあるテクスチャファイル一式 totsuka_01.bmp,WATATSUKU_Body_01.bmp,Watatuki_pants_01.bmp,Yori_face_01.bmp,YORI_HAIR.bmp,YORI_Suit.bmp
変換.batを以下のように記述します
ModelConverter.exe YORI_COLLADA.dae

変換.batを実行すると,YORI_COLLADA.mdxが生成されます

この時のフォルダ内はこんな感じです。全部同じところにぶち込めばうまくいきましたw

この mdxファイルをプロジェクトに追加します

1. YORI_COLLADA.mdxを,AppMain.csのあるところと同じフォルダにコピーする
2. PS Suite Studioのソリューションのすぐ下のフォルダで右クリック
そして,追加→ファイルを追加を選択
3. YORI_COLLADA.mdxファイルを選択して,右下の Openボタンをクリック
4. 追加された YORI_COLLADA.mdxファイルを右クリックして,ビルドアクション→Contentにチェック(※ココ重要)

これでモデルデータをプロジェクトにセットできました


新規作成時のソリューションには,BasicModelクラスを含むライブラリは設定されていません
1. PS Suite Studioの参照を右クリックして,参照アセンブリの編集

2. Edit Referencesダイアログが開くので,Sce.Pss.HighLevel.Modelにチェックを入れて,OKボタンをクリック


AppMain.csソースにモデルデータ表示を追加します
1. 上の usingが沢山並んでいるところに追加する
using Sce.Pss.HighLevel.Model;

2. AppMainクラス宣言の下に,BasicModelとBasicProgram定義を追加する
	public class AppMain
	{
		private static GraphicsContext graphics;
		static BasicModel model;	//追加
		static BasicProgram program;	//追加
3. Initializeに初期化を追加
		public static void Initialize ()
		{
			model = new BasicModel("/Application/YORI_COLLADA.mdx", 0) ;	//追加
			program = new BasicProgram();	//追加
4. Mainの最後に終了処理を追加
		public static void Main (string[] args)
		{
			Initialize ();

			while (loop) {
				SystemEvents.CheckEvents ();
				Update ();
				Render ();
			}
			
			SampleDraw.Term();
			model.Dispose() ;	//追加
			program.Dispose() ;	//追加
			graphics.Dispose() ;
		}
5. Renderに描画を追加
		public static void Render ()
		{
			Matrix4 proj = Matrix4.Perspective(FMath.Radians( 60.0f ), graphics.Screen.AspectRatio, 1.0f, 1000000.0f);	//追加
			Matrix4 view = Matrix4.LookAt(new Vector3(0.0f, 0.0f, 170.0f),
										new Vector3(0.0f, 70.0f, 0.0f),
										new Vector3(0.0f, 1.0f, 0.0f));	//追加

			BasicParameters parameters = program.Parameters;	//追加
			parameters.SetProjectionMatrix(ref proj);	//追加
			parameters.SetViewMatrix(ref view);	//追加

			graphics.SetViewport(0, 0, graphics.Screen.Width, graphics.Screen.Height);	//追加

			// Clear the screen
			graphics.SetClearColor(0.0f, 0.0f, 0.0f, 0.0f);
			graphics.Clear();

			model.Update();	//追加
			model.Draw(graphics, program);	//追加

			// Present the screen
			graphics.SwapBuffers();
		}

実行してみたところ,なんか見たことのあるような感じに。。。

描画順がおかしいのでこうなります
OpenGLでは深度テストをオンにすれば良いはずです

Renderに以下の行を追加する
			graphics.Enable(EnableMode.DepthTest);	//追加

そうすると,正しい描画になりました


○アスペクト比を 16:9に固定する
ゲームは画面サイズを固定にする必要があるので,16:9でビューポートを設定します

まずは,プロジェクションのアスペクト比率を 16:9に固定
			Matrix4 proj = Matrix4.Perspective(FMath.Radians(60.0f), graphics.Screen.AspectRatio, 1.0f, 1000000.0f);

			Matrix4 proj = Matrix4.Perspective(FMath.Radians(60.0f), 16.0f/9.0f, 1.0f, 1000000.0f);

次に,ビューポートを 16:9のドットに変更
			graphics.SetViewport(0, 0, graphics.Screen.Width, graphics.Screen.Height);

			//画面比率設定
			if(16.0f/9.0f > (float)graphics.Screen.Width/(float)graphics.Screen.Height){
				//横に合わせる
				gameWidth = graphics.Screen.Width;
				gameHeight = graphics.Screen.Width * 9/16;
				if(gameHeight % 2 == 1){
					gameHeight++;
				}
				gameLeft = 0;
				gameTop = (graphics.Screen.Height - gameHeight) / 2;
			}else{
				//縦に合わせる
				gameWidth = graphics.Screen.Height * 16/9;
				if(gameWidth % 2 == 1){
					gameWidth++;
				}
				gameHeight = graphics.Screen.Height;
				gameLeft = (graphics.Screen.Width - gameWidth) / 2;
				gameTop = 0;
			}

graphics.SetViewport(gameLeft, gameTop, gameWidth, gameHeight);
スマフォでよくあるタイプの,横854×縦480ピクセルのディスプレイの場合。計算方法によっては1ドットずれるので注意する必要があります
854は16の倍数では無く,480も9の倍数では無い為です
PS Vitaの横960×縦544の場合には,上下を詰めて左右に少しハミ出しています
(ある意味Suiteで作るのは PSV対応の為なので,PSVの比率で設計するのもアリかとも思います)


TOPプログラマ専用PSSuite開発

Melonbooks DL