強火で進め

このブログではプログラム関連の記事を中心に書いてます。

3dsファイルを表示するサンプルをビルドしてみた


使用したサンプルプログラムは以下のサイトの「MAC OS version」。

Spacesimulator.net - 3ds format file reader, loader
http://www.spacesimulator.net/tut4_3dsloader.html

こちらはXcodeのプロジェクト形式であり、IDEプログラム大好きに自分にぴったりなサンプルでした。

さっそくXcodeで開いたところバージョンが古く、現在のバージョンの形式を作成する確認が出たのでOKを押して作成開始。

作成が完了した後、ビルド&実行しましたがウィンドウは真っ黒で何も表示されませんでした。

ブレークポイントを置きつつソースコードを追って行ったところ何やらファイルから読み込んだバイトの順番が逆でした。

ここで「もしかしてこれってPowerPC向けだからエンディアンをそれに合わせるためにリトルエンディア(Intel)→ビックエンディアン(PowerPC)の変換してる?」と思い、チェックしたところ予想通り変換をかけている部分が見つかりました。ここを修正したところ正常に表示されました。

このサンプル、昔のなのでPowerPC向けのサンプルだったみたいです。

変更した部分は 3dsloader.cpp の #include "convert.h" をコメントアウトしてエラーとなったところです。全てコメントアウトの対応でOKでした。

例えば以下の様な感じです。

//		l_chunk_id = ConvertEndianus(l_chunk_id); // Convert to corrent endian

この修正だけできちんと表示できました。3dsファイルのフォーマットってバイナリな割りに予想以上にシンプルで意外と使い勝手よさそうでした。

注意点

あくまでサンプルであり、以下の様に頂点やポリゴン情報の数が固定値となっています。

#define MAX_VERTICES 8000 // Max number of vertices (for each object)
#define MAX_POLYGONS 8000 // Max number of polygons (for each object)
typedef struct {
	char name[20];
    
	int vertices_qty;
    int polygons_qty;

    vertex_type vertex[MAX_VERTICES]; 
    polygon_type polygon[MAX_POLYGONS];
    mapcoord_type mapcoord[MAX_VERTICES];
    int id_texture;
} obj_type, *obj_type_ptr;

実際に自分のプログラムで使用する場合はこの辺りの部分は修正する必要があります。

参考サイト

3dsファイルのフォーマット解説をしているサイト。日本語。

3DSファイルフォーマット
http://www.hiramine.com/programming/3dmodelfileformat/3dsfileformat.html

Chunk IDの情報が充実しているサイト。英語。
他のサイトではChunk IDが 0x0002 の場合、何のデータか記載が無かったのですがこちらには記載がありました(3dsファイルフォーマットのバージョン情報の様でした)。ここは他のサイトよりも情報が充実している印象でした。

Autodesk 3D Studio: Summary from the Encyclopedia of Graphics File Formats
http://www.fileformat.info/format/3ds/egff.htm

The Labs: 3DS File Format
http://www.the-labs.com/Blender/3DS-details.html