@wikiメニュー編集表示ツールヘルプブックマーク登録RSS登録
ログイン
新規ページ作成
すでにあるページをコピーして新規ページを作成 スレッドフロート型掲示板から引用して新規ページ作成(α版) ブログの内容から引用して新規ページ作成(α版) ファイルをアップロードして新規ページ作成(α版) 他のホームページから引用して新規ページ作成(α版)
[PR] 無料ホームページ @PAGES [PR] オークション@pedia [PR] 2ch型無料レンタル掲示板 @chs
@wikiで新規wikiを作成
このページを編集 このページを編集(メニュー非表示編集;α) このページをコピーして新規ページを作成 このページのページ名を変更 このページの編集モードを変更 このページの閲覧/編集権限の変更
このページにファイルをアップロード
このウィキにファイルをアップロード(FTP機能/管理者のみ利用可)
メニューを編集(メニュー部分は非表示で編集)
このページの最新版変更点このページの編集履歴(バックアップ) このページへのリンク元 このページへのトラックバック
このページをPDFで表示(α版)
関連ページ(α版) 関連ホットワード(α版)
このwikiのページ一覧 編集履歴(バックアップ)のあるページ一覧 このwikiのタグ一覧 このwikiの更新情報RSSこのwikiの更新情報RSS このwikiの新着ページRSSこのwikiの新着ページRSS
このwiki内を検索 @wikiパーツ▶  @wiki便利ツール▶  このwikiの管理者に連絡
@wiki助け合いコミュニティ @wiki助け合い掲示板
wiki(ウィキ)って何?
初心者ガイド
ご利用ガイド 良くある質問 プラグイン一覧 編集モードの違いについて 不具合や障害を見つけたら 管理・設定マニュアル
はてなブックマークする FC2ブックマークに追加 Livedoor クリップに追加 Yahoo!ブックマークに登録 del.icio.usに追加
はてなRSSに追加 livedoor ReaderにRSSフィードを登録 Yahoo!にRSSフィードを登録 BloglinesにRSSフィードを登録 NewsGator OnlineにRSSフィードを登録 iGoogleにRSSを追加
@wikiパーツ:あなたのサイトにWikiデータを簡単表示!
最近更新したページの一覧を表示する 最近作成したページの一覧を表示する このwiki内を検索するフォームを表示する このwikiのタグクラウドを表示する 自動リンク辞書を利用する
@wiki便利ツール:トップページ
まとめサイト作成支援ツール RSSかんたん作成 興味キーワードをチェック!!(RSSナビ) いろんなblogのRSSかんたん作成ページ アマゾン商品検索(簡単アフィリエイト) wikiに株式情報(日本)を表示 wikiに株式情報(中国)を表示 かんたんHTML直接入力 Q&Aサイトかんたん連携作成 wikiに為替情報を表示 はてなアンテナと簡単連携

ODEでXファイルからポリゴンを表示する



Xファイルは、DirectXの3Dフォーマットのようです。
多くの3Dモデリングツールがサポートしています。
たとえば、BlenderやMetasequoiaといったもの。

ここでは、Xファイル(アスキー形式)を読み込むためのクラスを作ってみました。
デバッグはそこそこしかしてません。
バグったらごめんなさい。

とりあえず、BleanderとMetasequoiaのXファイルは読めました。

BlenderでXファイルのエクスポート時、"Flip z"が有効になっているとポリゴンの表裏が反転してしまうので注意してください。



Metasequoia(無料版)の基本図形の1つ(立方体)を読み込んで表示したところ。
2つ生成して重ねています。

draw_x.zip

以前作成したSTL用のものとAPIを合わせて作っています。


使い方


  • ヘッダ
#include "XReader.h"

namespaceは、ode_utilsです。(using namespace ode_utils;)

  • クラス
ode_util::XReader<V_TYPE,IDX_TYPE>
V_TYPEは、頂点座標の型(floatもしくはdouble)
IDX_TYPEは、頂点座標番号の型(intもしくはdTriIndex)

  • API

XReader( const char* file_name ) コンストラクタ、file_nameは、読み込むX(アスキー)ファイル名
bool isCompleted() Xファイルが正常に読み込まれるとtrueを返す
const char* message() ファイル処理時の完了/エラーメッセージを返す
const vertex_type* getVertices() 頂点座標配列の先頭ポインタを返す
const index_type* getIndices() 頂点座標番号配列の先頭ポインタを返す
int getVertexCount() 頂点座標の数を返す。
int getIndexCount() 頂点座標番号の数を返す。

vertex_typeはV_TYPEで与えたもの。
index_typeはODX_TYPEで与えたもの。


  • XReaderの仕様

Xファイル内で、
Mesh {
 ・・・
}
のvertex数、頂点データ、index数、頂点インデックスのみを取得します。
template{}はすべて無視します。
MeshMaterialList、Material、Normalといったものもすべて無視です。

頂点インデックスは、3つ(三角形)もくしは4つ(四角形)の番号がセットになる場合があります。ODEのTriMeshは4つには対応していないので、4つセットのものは3つに分割しています。


字句解析には、無駄にre2cを使っています。(勉強がてら)
なのでクラスの中は一部人には読めないものになっています。


ODE記述


#include "XReader.h"
 
static dBodyID body1, body2;
static dGeomID geom1, geom2; 
ode_utils::XReader<float,dTriIndex> *mesh;
 
 
    mesh = new ode_utils::XReader<float,dTriIndex>("cube2.x");
    if (!mesh->isCompleted()) {
        printf( "mesh error\n");
        printf( "msg : \n%s", mesh->message() );
 
        printf("vertexCount=%d\n", mesh->getVertexCount());
        printf("getIndexCount=%d\n", mesh->getIndexCount());
        printf("vertices pointer=%d\n", mesh->getVertices());
        printf("indices pointer=%d\n", mesh->getIndices());
        exit(1);
    }
 
 
    body = dBodyCreate( world );
 
    dTriMeshDataID data;
    data = dGeomTriMeshDataCreate();
    dGeomTriMeshDataBuildSingle(data, mesh->getVertices(), 3*sizeof(float), mesh->getVertexCount(),
        mesh->getIndices(), mesh->getIndexCount(), 3*sizeof(dTriIndex));
 
    geom = dCreateTriMesh(space, data, 0, 0, 0);
    dGeomSetData( geom, data );
 
    dMass m;
    dMassSetTrimesh( &m, mass, geom );
    dGeomSetPosition( geom, -m.c[0], -m.c[1], -m.c[2] );
    dMassTranslate( &m, -m.c[0], -m.c[1], -m.c[2] );
    dBodySetMass( body, &m );
 
    dGeomSetBody( geom, body );
 
 


drawstuff記述例


dsSetColor( 1, 1, 0 );
    {
        const dReal* pos = dGeomGetPosition(geom1);
        const dReal* rot = dGeomGetRotation(geom1);
 
        const dTriIndex *index = mesh->getIndices();
        for (int ii = 0; ii < mesh->getIndexCount()/3; ii++) {
            const dReal v[9] = {
                mesh->getVertices()[index[ii*3+0]*3 + 0],
                mesh->getVertices()[index[ii*3+0]*3 + 1],
                mesh->getVertices()[index[ii*3+0]*3 + 2],
                mesh->getVertices()[index[ii*3+1]*3 + 0],
                mesh->getVertices()[index[ii*3+1]*3 + 1],
                mesh->getVertices()[index[ii*3+1]*3 + 2],
                mesh->getVertices()[index[ii*3+2]*3 + 0],
                mesh->getVertices()[index[ii*3+2]*3 + 1],
                mesh->getVertices()[index[ii*3+2]*3 + 2]
            };
            dsDrawTriangle( pos, rot, &v[0], &v[3], &v[6], 1 );
        }
    }
 
添付ファイル