ぽりごん

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

気軽にコメントをどうぞ!

この記事に関すること冬月に聞きたいこと等、小さいことでもコメントしていただける嬉しいです。
冬月に直接連絡したい方は下のお問合せフォームをお使いください。(メール送信されます)

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。
※メールアドレスは公開されることは有りません。


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

ゲーム製作の関連記事