トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

PMDの読み込みとか

[プログラミング]

最近、学習素材として最適なGitHubプロジェクトができた、マストチェック

Xmesh

メッシュを読み込む!!(2) ~Xファイル~

☆PROJECT ASURA☆さんのところで公開されているDirectX用の3Dモデルのデータ型、Xファイル(*.x)の読み込みと表示をするプログラムだそうです。

PMDファイルはもともとXファイルを拡張して作られているらしいので参考になるはず。ちなみに上記のプログラムはテキストベースのXファイルをロードするためのものです。

Linux対応
一部のコードを修正するとLinuxでも動きました(文字コードを変えてないのでタイトルは変)

ソースコードはこちら Hiroyuki-Nagata/OpenGLWorks

ファイルが存在しません。

  Xmeshのデータ構造

Doxygenで生成したクラス図

ファイルが存在しません。

Xmeshのクラス詳細

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

  MMDのモデルデータ(PMD)形式

PMD形式の詳細とXMeshの比較

  • 情報はすべて通りすがりの記憶様のサイトに掲載されている内容を参考にしてます。
  • PMDファイルはオープンな仕様ではなくバイナリフォーマットからの解析なので変数名は任意のものです
型情報早見表
C/C++の型 Win32 API での別名
unsigned char BYTE
unsigned short WORD
unsigned long DWORD
ヘッダ
MMDのモデルデータ(PMD)形式 めも
変数(型) 役割 XMesh内で対応するものの有無
magic(char[]) 固定値 なし
version(float) 固定値 なし
model_name(char[20]) モデル名称 XModel->mesh->name
comment(char[256]) コメント なし
頂点リスト
MMDのモデルデータ(PMD)形式 めも2
変数(型) 役割 XMesh内で対応するものの有無
vert_count(DWORD) 頂点数 XModel->mesh->numVertices
vertex(t_vertex[]) 頂点データ XModel->mesh->vertex
t_vertex
頂点データ
変数(型) 役割 XMesh内で対応するものの有無
pos(float[3]) 座標:x, y, z XModel->mesh->vertex
normal_vec(float[3]) 法線ベクトル:nx, ny, nz XModel->mesh->normal
uv(float[2]) UV座標:u, v XModel->mesh->texcoord
bone_num(WORD[2]) ボーン番号1,2 なし
bone_weight(BYTE) ボーン1に与える影響度 なし
edge_flag(BYTE) 輪郭有効:0, 輪郭無効:1 なし
面頂点リスト
MMDのモデルデータ(PMD)形式 めも3
変数(型) 役割 XMesh内で対応するものの有無
face_vert_count(DWORD) 頂点数 not 面数 XModel->mesh->face->element
face_vert_index(WORD[]) 頂点番号(3個/面) XModel->mesh->face->indexVertices
材質リスト
MMDのモデルデータ(PMD)形式 めも4
変数(型) 役割 XMesh内で対応するものの有無
material_count(DWORD) 材質数
material(t_material[]) 材質データ
t_material
変数(型) 役割 XMesh内で対応するものの有無
diffuse_color(float[3]) 減衰色
alpha(float) 減衰色の不透明度
specularity(float)
specular_color(float[3]) 光沢色
mirror_color(float[3]) 環境色
toon_index(BYTE)
edge_flag(BYTE) 輪郭フラグ
face_vert_count(DWORD) この材質で使う面頂点リストのデータ数
texture_file_name(char[20]) テクスチャファイル名
ボーンリスト
MMDのモデルデータ(PMD)形式 めも5
IKリスト
MMDのモデルデータ(PMD)形式 めも6
表情リスト
MMDのモデルデータ(PMD)形式 めも7
表情枠用表示リスト
MMDのモデルデータ(PMD)形式 めも8
ボーン枠用枠名リスト
MMDのモデルデータ(PMD)形式 めも9
ボーン枠用表示リスト
MMDのモデルデータ(PMD)形式 めも10

  参考

XLoader.hの抜粋

//
// 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();
};

テスト

お名前: コメント: