3D散歩ゲーム 08A2043 谷口盛海 研究動機 近年、MMDの普及で沢山のMMD用3Dモデルが 配布される様になった。このMMD用3Dモデルを 利用して何かを作ってみたいと思った。 MMD • MikuMikuDance(ミクミクダンス)とは、プリ セットされたキャラクターの3Dモデルを操作し コンピュータアニメーションを作成する3DCGソ フトウェアである。 PMD ・MMDで使われる独自形式の モデルデータファイル(.pmd) ・MMD ver1~2ではDirectXの形状データなどを 格納するXファイル(.x)をベースに拡張した(.xx)が 使われていたがVer3では(.xx)をさらに拡張した (.pmd)が使われるようになった DirectX • Microsoft DirectX(ダイレクトエックス)は、マイクロソフト社が 開発したゲームおよびマルチメディア処理用のAPIの集合で ある。(研究では9.0を使用) Windows API • Windows API(ウィンドウズ エーピーアイ)とは、Microsoft WindowsのAPIのことである。特に32ビットプロセッサで動作す るWindows 95以降やWindows NTで利用できるものはWin32 APIと呼ばれる。また、それらのWindowsにおけるWin32 APIの 実装をWin32と呼ぶ。 ウィンドウの作成 DirectX Graphicsインターフェイスを取得 デバイスの作成・設定 BeginScene() 画面の描画 EndScene() インターフェイスの開放 ループ 実行画面 MMDモデルの読み込み PMDファイル PMDデータ コピー MeshData MeshData meshData; for (unsigned int i = 0; i < numPmdVertex; ++i) { Vertex v; v.position = D3DXVECTOR3(pmdVertices[i].pos[0], pmdVertices[i].pos[1], pmdVertices[i].pos[2]); v.position *= 0.1f; // 倍率 v.normal= D3DXVECTOR3(pmdVertices[i].normal_vec[0], pmdVertices[i].normal_vec[1], pmdVertices[i].normal_vec[2]); v.texture = D3DXVECTOR2(pmdVertices[i].uv[0], pmdVertices[i].uv[1]); meshData.vertices.push_back(v); } delete pmdVertices; Face f; for (unsigned int i = 0; i < numPmdFace; ++i) { f.indices[i%3] = pmdFaces[i]; if (i%3 == 2) meshData.faces.push_back(f); } ifstream ifs(filename, ios::binary); if (ifs.fail()) throw TEXT("ファイルがありません"); ifs.read((char*)&pmdHeader, sizeof(pmdHeader)); unsigned long numPmdVertex; ifs.read((char*)&numPmdVertex, sizeof(numPmdVertex)); PmdVertex* pmdVertices = new PmdVertex[numPmdVertex]; ifs.read((char*)pmdVertices, sizeof(PmdVertex)*numPmdVertex); unsigned long numPmdFace; ifs.read((char*)&numPmdFace, sizeof(numPmdFace)); unsigned short *pmdFaces = new unsigned short[numPmdFace]; ifs.read((char*)pmdFaces, sizeof(unsigned short)*numPmdFace); unsigned long numPmdMaterial; ifs.read((char*)&numPmdMaterial, sizeof(numPmdMaterial)); PmdMaterial* pmdMaterial = new PmdMaterial[numPmdMaterial]; ifs.read((char*)pmdMaterial, sizeof(PmdMaterial)*numPmdMaterial); delete pmdFaces; D3DMATERIAL9 material = {0}; unsigned int j = 0, material_end = 0; for (unsigned int i = 0; i < numPmdMaterial; ++i) { CopyMaterial(material, pmdMaterial[i]); meshData.material.push_back(material); char tex[21] = {0}; // ファイル名が20byteのとき のために最後に0を追加 memcpy(tex, pmdMaterial[i].texture_file_name, 20); string s(tex); s = s.substr(0, s.find("*")); // temp meshData.texture_filename.push_back(s); material_end += pmdMaterial[i].face_vert_count; for (; j < material_end; ++j) meshData.faces[j/3].material_number = i; } delete pmdMaterial; 実行画面 今後の予定 • 衝突判定機能 • キーボード操作による移動・モーション • 環境音 参考文献・リンク • DirectX9 シェーダプログラミングブック • 3次元コンピュータグラフィックス • 私設研究所ネオテックラボ http://www.neo-tech-lab.co.uk/ • DirectX Class http://princess-tiara.biz/directx/ • PICの罠 http://www2.ocn.ne.jp/~mhage/PIC_Trap/
© Copyright 2025 ExpyDoc