[プログラミング,OpenGL]
メッシュを読み込む!!(2) ~Xファイル~
☆PROJECT ASURA☆さんのところで公開されているDirectX用の3Dモデルのデータ型、Xファイル(*.x)の読み込みと表示をするプログラムだそうです。
PMDファイルはもともとXファイルを拡張して作られているらしいので参考になるはず。ちなみに上記のプログラムはテキストベースのXファイルをロードするためのものです。
- Linux対応
- 一部のコードを修正するとLinuxでも動きました(文字コードを変えてないのでタイトルは変)
ソースコードはこちら Hiroyuki-Nagata/OpenGLWorks
- XModel
- XModelクラスを操作すればメッシュの読み込みと、3Dモデルの描画が出来るようになっている
メンバ変数(型) |
役割 |
mesh(XMesh) |
ポリゴンメッシュのデータの本体 |
material(XMaterial) |
ポリゴンメッシュの材質情報 |
box(XBoundingBox) |
画像の中心を[0, 0, 0]と仮定したとき、画像がx, y, z軸方向にどれだけあるのかという情報 |
sphere(XBoundingSphere) |
数学的には、n次元空間内において有限のオブジェクトの非空集合が与えられた場合(例えば座標の集合、もしくはバウンディングスフィア、つまり閉じた立方体もしくは閉じた球体など)、これらの全てを含むn次元の球体であるオブジェクト。 => 球体のことだと思っていたほうがよいかも?meshから計算する。 |
- XMesh
メンバ変数(型) |
役割 |
name(char[]) |
モデルの名称 |
numVertices(int) |
頂点の数 |
numNormals(int) |
頂点の法線の数 |
numTexCoords(int) |
UV座標の数 |
numFaces(int) |
三角形の面の数 |
vertex(XVector3*) |
頂点 |
normal(XVector3*) |
法線 |
texcoord(XVector2*) |
UV座標 |
face(XFace*) |
三角形の面についての情報 |
- XFace
メンバ変数(型) |
役割 |
element(int) |
要素数 |
indexMaterial(int) |
材質情報 |
indexVertices(int [4]) |
頂点配列 |
indexNormals(int [4]) |
法線配列 |
indexTexCoords(int [4]) |
UV座標配列 |
- XMaterial
- 材質データ
メンバ変数(型) |
役割 |
name(char[]) |
材質データ名称 |
ambient(XColor) |
環境光:光源からの光が様々なものに反射した結果として対象物体に当たる光 |
diffuse(XColor) |
拡散光:光源からの光が物体に一度反射して拡散した時の光 |
specular(XColor) |
鏡面光:ある一定方向に反射する光 |
emissive(XColor) |
放射光:物体そのものが発行する光 |
power(float) |
? |
textureFileName(char[]) |
貼り付けるテクスチャのファイル名 |
- XBoundingBox
メンバ変数(型) |
役割 |
min(XVector3) |
Bounding Boxの最小値 |
max(XVector3) |
Bounding Boxの最大値 |
- XBoundingSphere
メンバ変数(型) |
役割 |
center(XVector3) |
球体の中心座標 |
radius(float) |
半径 |
- ポリゴンメッシュ
- Wikipedia - ポリゴンメッシュ
- Bounding Box
- 誰も教えてくれないBounding Boxの話
- Bounding Sphere
- OpenGLプログラミングメモ: 3D:球と球 Wikipedia - Bounding Sphere
//
// forward declarations
//
class XFace;
class XMesh;
class XMaterial;
class XModel;
//
// XVector2 struct
//
struct XVector2
{
float x, y;
operator float* () { return (float*)&x; }
operator const float*() const { return (const float*)&x; }
};
//
// XVector3 struct
//
struct XVector3
{
float x, y, z;
operator float*() { return (float*)&x; }
operator const float*() const { return (const float*)&x; }
};
//
// XColor struct
//
struct XColor
{
float r, g, b, a;
operator float*() { return (float*)&r; }
operator const float*() const { return (const float*)&r; }
};
//
// XBoundingSphere struct
//
struct XBoundingSphere
{
XVector3 center;
float radius;
};
//
// XBoundingBox struct
//
struct XBoundingBox
{
XVector3 min;
XVector3 max;
};
//
// XFace class
//
class XFace
{
public :
int element;
int indexMaterial;
int indexVertices[4];
int indexNormals[4];
int indexTexCoords[4];
XFace &operator = (XFace &ob);
XFace();
void SetVertexIndex(int index[]);
void SetNormalIndex(int index[]);
void SetTexCoordIndex(int index[]);
};
//
// XMaterial class
//
class XMaterial
{
public :
char name[MAX_PATH];
XColor ambient;
XColor diffuse;
XColor specular;
XColor emissive;
float power;
char textureFileName[MAX_PATH];
XMaterial &operator = (XMaterial &ob);
XMaterial();
void SetName(char *str);
void SetTextureFileName(char *str);
};
//
// XMesh class
//
class XMesh
{
public :
char name[MAX_PATH];
int numVertices;
int numNormals;
int numTexCoords;
int numFaces;
XVector3* vertex;
XVector3* normal;
XVector2* texcoord;
XFace* face;
XMesh &operator = (XMesh &ob);
XMesh();
int AddVertex(XVector3 &ob);
int AddNormal(XVector3 &ob);
int AddTexCoord(XVector2 &ob);
int AddFace(XFace &ob);
void Release();
void SetName(char *str);
};
//
// XModel class
//
class XModel
{
private:
void ComputeBoundingSphere();
void ComputeBoundingBox();
public:
int numMeshes;
int numMaterials;
XMesh *mesh;
XMaterial *material;
XBoundingSphere sphere;
XBoundingBox box;
bool Load(const char *filename);
void Release();
void Render(int index, float scale=1.0f);
void Render(float scale=1.0f);
int AddMesh(XMesh ob);
int AddMaterial(XMaterial ob);
XModel();
};