法線データを持たない場合は、普通にデータをコピーするだけでよい。
【例】
struct Mesh
{
int nIndex;//インデックス数
std::vector<float> vertex;//頂点座標格納場所
std::vector<unsigned short> index;//インデックスデータの格納場所
};
std::vector<Mesh> eachMesh;
… …
void load3dsModel()
{
Lib3dsFile *m_model; //モデル全体
Lib3dsMesh *mesh; //メッシュ単位
//モデル読み込み
m_model = lib3ds_file_open(modelname);
if(m_model==NULL)
{
std::cerr << "can't Open file\n";
exit(0);
}
eachMesh.resize(m_model->nmeshes);//メッシュ分メモリ確保
for(int loop = 0; loop < m_model->nmeshes;++loop)
{
mesh = m_model->meshes[loop];//mLoop番目のメッシュへのポインタ
//頂点データの取り出し
eachMesh[loop].vertex.resize(mesh->nvertices*3);//頂点数*3要素
memcpy(&eachMesh[loop].vertex[0],&mesh->vertices[0][0],sizeof(float)*mesh->nvertices*3);
//インデックスデータの取り出し
eachMesh[loop].nIndex = (mesh->nfaces*3);
eachMesh[loop].index.resize( eachMesh[loop].nIndex );//面の数*3頂点分=総インデックス数
for(int iloop = 0;iloop < mesh->nfaces;++iloop)
{
memcpy(&eachMesh[loop].index[iloop*3],&mesh->faces[iloop].index[0],sizeof(unsigned short)*3);
}
}
lib3ds_file_free(m_model);
}
… …
//描画
glEnableClientState(GL_VERTEX_ARRAY);
for(int loop = 0; loop < MeshNum;++loop)
{
glVertexPointer(3, GL_FLOAT, 0,&eachMesh[loop].vertex[0]);
glDrawElements(GL_TRIANGLES,eachMesh[loop].nIndex, GL_UNSIGNED_SHORT, &eachMesh[loop].index[0]);
}
glDisableClientState(GL_VERTEX_ARRAY);
… …
※C++「vector」を使用。