ぽりごん

冬月 はい
現在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プログラムで一番おもしろいところでありますね
設子

ゲーム製作の関連記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください