谷口盛海

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/