2 Answers
2

Ultimately, each mesh is a collection of OpenGL primitives (triangles, triangle strips, etc) that form a 3D model. You'll want a level to include a variety of meshes, so you can address them each separately.

To my knowledge, each mesh can only have one material, although generally one would use texturing to get around this (I.e. set up a texture to color each part of the model as you like). A texture or material can be reused on multiple models.

Sorry, I don't have experience with this.

To answer your original question, this depends slightly on what you are using the models for. If your models will be rigid, meaning you will not change each vertex individually, and you will render many frames with the same model, you will achieve the best performance not by storing the models in your class, but in vertex buffer objects (VBOs). This basically means that the models are stored in GPU memory instead of CPU memory, minimizing GPU to CPU transfers and greatly improving rendering performance. A good tutorial on OpenGL ES vertex buffering is available at http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/ (This is for android, but the code will be similar).

1 and 2: Sounds like your 3D model is what contains transformation of an object and the mesh data. If you want want hierarchical objects, your 3D models should have child models. Meshes themself don't need hierarchy, a flat list is enough. Each part of a model should allow own material, so each mesh should have a material assigned. However even in that case it's a good idea to allow meshes to share the same vertex data, i.e. vertex buffers inside a single 3D model. Index buffers are unique for each mesh.

You can also add one level of indirection, where the list of meshes can be shared between different 3D models. You could rename the meshes to mesh clusters and the list of meshes as the mesh itself. In that case the 3D models could share meshes.