5年後起業することを夢見る、初心者ゲームプログラマーの神楽坂 冬月による同人と気ままな日記ブログです。

ぽりごん

2014.10.19


冬月 はい
現在3Dの出力周りを調整しています
上の図ではわからないですが、カメラを回転させています

使っているライブラリが2D描画を前提に考えられているため
正方形のモデルを表示するだけでちょっと手間がかかるのが難点だね
写真の表示だけでも、1つのライブラリを追加してシェーダーを使っています
冬華

でも、このお話。前にもやった話なのですが
自分のメモ書きも兼ねて導入の方法を書き留めておきます
ということで、続きを読むからどうぞ
設子

http://assimp.sourceforge.net/

冬月 モデルの読み込みで使ったのは
assimpというものです。Windows、OSX、Linux
とマルチプラットフォームで使えます

また、
読み込めるモデルフォーマットがたくさんあるのも特徴の一つね
DirectXでよく使っていたXファイルも読めるのが今回の採用点ね
冬華

OpenGLで使っている場合、このあたりの読み込み処理も
すべて作成する必要がありましたが、このライブラリのお陰でどのファイルフォーマットも同じ構成で読むことが出来ます
冬月さんが学生の頃にコレがあったらOpenGLのスキルももっと上がっていたのかもしれませんね
設子

  
  
	//インポータークラスのインスタンスを作成します
	const struct aiScene* scene;


	//--------------------------------------------------------------------------------
	//モデルデータの読み込み
	scene = aiImportFile(wzDCP(modelPach),
		aiProcess_CalcTangentSpace      | 
		aiProcess_Triangulate           |
		aiProcess_FlipUVs               |
		aiProcess_SortByPType
	);


  


冬月 コレが実際のコードになります
wzDCPというのはファイルパスを宣言しているものになるので
scene = aiImportFile() 実際にはコレが読み込み処理になります

正常に読み込めたら
sceneがnull以外のアドレスになります
第2引数は表示系の処理は行わない設定になっています
冬華

  
  

	p_MeshNum = scene->mNumMeshes;
	g_my_mesh = new MY_Mesh[p_MeshNum];
	
	// メッシュ生成
	for (unsigned int i = 0; i < p_MeshNum; ++i) {
		scene_mesh = (scene->mMeshes[i]);
		  
		g_my_mesh[i].vsize = scene_mesh[0].mNumVertices;			//頂点数
		g_my_mesh[i].fsize = scene_mesh[0].mNumFaces;				//ポリゴン数
	
		g_my_mesh[i].vertex = new wzVector3[g_my_mesh[i].vsize];
		g_my_mesh[i].texcoord = new wzVector2[g_my_mesh[i].vsize];
		g_my_mesh[i].normal = new wzVector3[g_my_mesh[i].vsize];

		g_my_mesh[i].color = new wzVector4[g_my_mesh[i].vsize];


		for(int n = 0; n < g_my_mesh[i].vsize; n++){
			//座標
			g_my_mesh[i].vertex[n].x = scene_mesh->mVertices[n].x;
			g_my_mesh[i].vertex[n].y = scene_mesh->mVertices[n].y;
			g_my_mesh[i].vertex[n].z = scene_mesh->mVertices[n].z;

			//UV
			g_my_mesh[i].texcoord[n].x = scene_mesh->mTextureCoords[0][n].x;
			g_my_mesh[i].texcoord[n].y = scene_mesh->mTextureCoords[0][n].y;
			
			//座標
			g_my_mesh[i].normal[n].x = scene_mesh->mNormals[n].x;
			g_my_mesh[i].normal[n].y = scene_mesh->mNormals[n].y;
			g_my_mesh[i].normal[n].z = scene_mesh->mNormals[n].z;

			//とりあえず
			g_my_mesh[i].color[n].x = 1.0f;
			g_my_mesh[i].color[n].y = 1.0f;
			g_my_mesh[i].color[n].z = 1.0f;
			g_my_mesh[i].color[n].w = 1.0f;

		}

		//インデックス
		g_my_mesh[i].idx = new unsigned short[scene_mesh->mNumFaces*3];
		int count = 0;
		for(unsigned int n = 0; n < scene_mesh->mNumFaces; n++){

			//3頂点じゃない
			if(scene_mesh->mFaces[n].mNumIndices != 3){
				printf("X_Flie Load_Not_3vertex\n");
			}

			for(int m = 0; m < 3; m++){
				//インデックス
				g_my_mesh[i].idx[count] = scene_mesh->mFaces[n].mIndices[m];
				count++;
			}

		}

		//頂点情報
		void* vertex_array[] = {
			g_my_mesh[i].vertex, 
			g_my_mesh[i].texcoord, 
			g_my_mesh[i].color, 
			g_my_mesh[i].normal
		};

		//Wizapply用のメッシュ構造に変更
		if(myCreateMesh(
			&g_my_mesh[i].pMesh,			//出力するマップデータ
			vertex_array,					//頂点情報
			g_ve_var,						//頂点属性
			g_my_mesh[i].idx,				//頂点インデックス
			g_my_mesh[i].vsize,				//頂点数
			g_my_mesh[i].fsize)				//ポリゴン数
		){
			printf("X_Flie CREATE_ERROR\n");
		}
	}

  


以上が
読み込んだモデルデータを解析して今使っているライブラリに合わせている処理です
sceneの中にモデルデータは格納されますのでそれを入れなおせばいいのです
設子

冬月 あとはシェーダーに投げるなり
使用しているライブラリに合わせる形にするなりすれば表示されると思います


DirectX10までの頃はXファイルが標準対応で
関数を呼び出すだけで表示できたのですが
最新のものはXファイルが使えないらしいのですが、どのよう担っているのでしょうかね
冬華

でも、なんとか表示できるようになりましたので
次回はもう少々ポリゴン数の多いマップの表示などもさせてみたいと思っています
3Dプログラムで一番おもしろいところでありますね
設子

関連記事

テーマ : ゲーム製作 関連

ジャンル : ゲーム

コメント
コメントの投稿


管理者にだけ表示を許可する

FC2カウンター
プロフィール

神楽坂 冬月(かぐらざか ふゆつき)

Author:神楽坂 冬月(かぐらざか ふゆつき)
【イベント情報】

2015年08月14日(1日目)
コミックマーケット88に参加します!
【金曜日 東地区 "ソ" ブロック 43a】
です!
東方紅魔烏【ウォーシミュレーション】
妖夢龍剣伝(体験版)【アクション】
の2点を出店予定です
よろしくお願い致します!

-----------------------------------------
2014年12月29日
コミックマーケット87に参加します!
【月曜日 東地区 "ハ" ブロック 50a】
参加してくださった型、ありがとうございます&
お疲れ様でした!

-----------------------------------------

めざせ!業界有名人!ということで新米ゲームプログラマーとして活動しています。
次の段階へ移行!
5年後起業という目標に目指してがんばりますぞ!

バナー2
http://studio-cross.com/
HPも作ってますので、どうぞよろしくお願いします

pixiv
月別アーカイブ