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