COLLADAのとっかりはこちら。COLLADA DOMを使った3Dモデルデータの読み込み。
XSDはこちら。CodeSynthesis XSD
おおまかな流れとしては,
- XSDをVisual Studioに導入する。
- COLLADA 1.4.1 Schema (includes OpenGL ES Profile)をローカルに保存する。
- 保存したSchemaをソリューションに追加して,XSDでC++パーサにコンパイルする。
- コンパイルオプションはこちらにあるように–parts 3等で分割指定が必須。
- コンパイルしたC++パーサをソリューションに追加する。
- COLLADAの読み込み部分を作成する。1行で読み込めるが初めから高速化に対応した方がよい。
- OpenGLの表示処理を作成する。パース結果の利用方法(triangleのみ描画)は下記。
using namespace COLLADASchema; const COLLADA::library_geometries_sequence& g = bhc->m_dae_preview->library_geometries(); for (COLLADA::library_geometries_const_iterator i = g.begin(); i != g.end(); i++) { const library_geometries::geometry_sequence& h = (*i).geometry(); for (library_geometries::geometry_const_iterator j = h.begin(); j != h.end(); j++) { const mesh::triangles_sequence& t = (*j).mesh()->triangles(); for (mesh::triangles_const_iterator k = t.begin(); k != t.end(); k++) { unsigned int numberOfInputs = (*k).input().size(); unsigned int numberOfTriangles = (*k).p()->size() / numberOfInputs; unsigned int offset = 0; int texoffset = -255; int noroffset = -255; for (triangles::input_const_iterator l = (*k).input().begin(); l != (*k).input().end(); l++) { if ((*l).semantic() == "VERTEX") offset = (*l).offset(); if ((*l).semantic() == "TEXCOORD") texoffset = (*l).offset(); if ((*l).semantic() == "NORMAL") noroffset = (*l).offset(); } for (int ii = 0; ii < numberOfTriangles; ii++) { int index = (*k).p()->at(ii * numberOfInputs + offset); if (noroffset == -255) { glNormal3f( (*j).mesh()->source().at(1).float_array()->at(index * 3), (*j).mesh()->source().at(1).float_array()->at(index * 3 + 1), (*j).mesh()->source().at(1).float_array()->at(index * 3 + 2) ); } else { int norindex = (*k).p()->at(ii * numberOfInputs + noroffset); glNormal3f( (*j).mesh()->source().at(1).float_array()->at(norindex * 3), (*j).mesh()->source().at(1).float_array()->at(norindex * 3 + 1), (*j).mesh()->source().at(1).float_array()->at(norindex * 3 + 2) ); } if (texoffset != -255) { int texindex = (*k).p()->at(ii * numberOfInputs + texoffset); glTexCoord2f( (*j).mesh()->source().at(2).float_array()->at(texindex * 2), (*j).mesh()->source().at(2).float_array()->at(texindex * 2 + 1) ); } glVertex3f( (*j).mesh()->source().at(0).float_array()->at(index * 3), (*j).mesh()->source().at(0).float_array()->at(index * 3 + 1), (*j).mesh()->source().at(0).float_array()->at(index * 3 + 2) ); } } } }
m_dae_previewは,
std::auto_ptr<COLLADASchema::COLLADA> m_dae_preview;
というデータメンバで,COLLADAをロードした結果を保持している。
COLLADA DOMより少し速度が遅いし,分かりやすさもないので,COLLADAをパースしてみたい人は素直にCOLLADA DOMを使った方がよいかも。
コメントを残す