トップページ > 記事閲覧
独自のフォーマットから3Dモデルハンドルを作成する方法
名前:nn 日時: 2017/04/30 16:39

度々お世話になります。 現在MagicaVoxelというソフトで作られたVoxelモデル(立方体ブロックを積み上げて作られた3Dモデル)を使用したゲームの開発をしております。 MagicaVoxelではエクスポートできるファイル形式の中にvoxファイルという「座標(X,Y,Z)にテクスチャ座標(U,V)で指定された色の立方体ボックスがある」 といった感じの最小限の情報のみで形成されたフォーマットがあり、現在このファイルフォーマットを読み込んでDrawCube3Dを利用しモデルを描画しています。 ですが、このように独自のフォーマットでモデルを形成すると、モデルハンドルが必要なDXライブラリ関数が使用できなくなってしまいます。 このように対応していないファイルフォーマットから独自の描画形式で描画したモデルからDXライブラリ上で動作するモデルハンドルを作成することはできますか? MV1LoadModelFromMemという関数の存在自体は知っているのですが、これの使い方というか、そもそもこれが使えるのかどうかもいまいちわかりません・・・。 わざわざvoxファイルを使用しているのは単純にmqoファイルへの変換に手間がかかるのと、Voxelで疑似アニメーションをすると 1コマずつモデルファイルを出力しなければならなくなるためテクスチャ画像も合わせてファイル数や容量が肥大化してしまう、 というだけで別にmqoファイルでも問題ないことは問題ないので、特に早急な対応は望んでいない、ということだけは予め言っておきます。 それとこれは管理人様への私信なのですが、前回私が質問した項目、 管理人様の最後の返信が他の方の質問への回答になってしまっています・・・(ここで言うことではありませんが!) その件に関しましてもこちらで一応解決したことにしていますので、特に回答してくださらなくても大丈夫です。
メンテ

Page: 1 |

Re: 独自のフォーマットから3Dモデルハンドルを作成する方法 ( No.1 )
名前:管理人 日時:2017/04/30 21:17

> このように対応していないファイルフォーマットから独自の描画形式で描画したモデルからDXライブラリ上で動作するモデルハンドルを作成することはできますか? すみません、できません 一番簡単なのは voxファイルを xファイルに変換するプログラムを作成して、変換した xファイルを MV1LoadModel または MV1LoadModelFromMem で読み込むという方法になると思います ( 最速なのは voxファイルを xファイルに変換したものをメモリに格納して、MV1LoadModelFromMem で読み込む方法です ) MV1LoadModelFromMem は MV1LoadModel で読み込めるファイルがメモリ上に存在していた場合に使用する関数なのですが、 MV1LoadModel で読み込めるモデルファイルはモデルファイル単体で完結しない形式が多いので( 主にテクスチャファイルが 別ファイルとなっているので )、テクスチャファイルなどを読み込む関数を引数で渡すようになっています 実装当時の解説をこの書き込みの最後に載せましたので、よろしければご覧ください m(_ _)m > それとこれは管理人様への私信なのですが、前回私が質問した項目、 > 管理人様の最後の返信が他の方の質問への回答になってしまっています・・・(ここで言うことではありませんが!) > その件に関しましてもこちらで一応解決したことにしていますので、特に回答してくださらなくても大丈夫です。 おぉ、本当ですね、すみません orz 回答は不要とのことですが、一応書き込みを行った当日に書いていた本来のご返信内容に変更しておきます ------------------------------------------------------- // メモリ上のモデルファイルイメージと独自の読み込みルーチンを使用してモデルを読み込む int MV1LoadModelFromMem( void *FileImage, int FileSize, int (* FileReadFunc )( const char *FilePath, void **FileImageAddr, int *FileSize, void *FileReadFuncData ), int (* FileReleaseFunc )( void *MemoryAddr, void *FileReadFuncData ), void *FileReadFuncData ) ; void *FileImage  メモリに読み込んだモデルファイルの先頭アドレス int FileSize  メモリに読み込んだモデルファイルのサイズ int (* FileReadFunc )( const char *FilePath, void **FileImageAddr, int *FileSize, void *FileReadFuncData )  ファイルを読み込むコールバック関数のポインタ    const char *FilePath : 読み込むべきファイルのパス( モデルファイル内に記述されているものそのまま )    int **FileImageAddr : 読み込むべきファイルのメモリアドレスを代入するポインタのアドレス    int *FileSize : 読み込むべきファイルのサイズを代入する変数のアドレス    void *FileReadFuncData : 使用者が必要な情報のアドレス( MV1LoadModelFromMem の引数 FileReadFuncData がそのまま渡されます )  コールバック関数で行う必要がある処理は  引数 FileImageAddr が示すアドレスに指定されたファイルをメモリに読み込んだもの( 若しくは既にあるもの )の先頭アドレスを代入して  引数 FileSize が示すアドレスに指定されたファイルのサイズを代入する  です  戻り値はファイルの読み込みに成功した場合は 0 を、失敗した場合は -1 を返してください int (* FileReleaseFunc )( void *MemoryAddr, void *FileReadFuncData )  読み込んだファイルを解放するコールバック関数のポインタ    void *MemoryAddr : FileReadFunc で指定したコールバック関数内で FileImageAddr に代入したファイルイメージの先頭アドレス    void *FileReadFuncData : 使用者が必要な情報のアドレス( MV1LoadModelFromMem の引数 FileReadFuncData がそのまま渡されます )  例えば引数 FileReadFunc で指定したコールバック関数内でメモリを確保した場合、この関数で解放してください void *FileReadFuncData  FileReadFunc と FileReleaseFunc で指定したコールバック関数に引数として渡されるアドレスです、  必要な固有データがある場合はこの引数を介して渡すことができます この関数を使用して普通にファイルから読み込む部分をコールバック関数で処理するようにしたサンプルを 書いてみましたので、よろしければご覧になってみて下さい #include "DxLib.h" #include <stdio.h> #include <malloc.h> // ファイルを読み込む関数 int LoadFile( const TCHAR *FilePath, void **FileImageAddr, int *FileSize ) { FILE *fp ; // ファイルを開く fp = fopen( FilePath, "rb" ) ; // 失敗したら -1 を返す if( fp == NULL ) return -1 ; // ファイルのサイズを取得 fseek( fp, 0L, SEEK_END ) ; *FileSize = ftell( fp ) ; fseek( fp, 0L, SEEK_SET ) ; // メモリの確保 *FileImageAddr = malloc( *FileSize ) ; // ファイルの読み込み fread( *FileImageAddr, *FileSize, 1, fp ) ; // ファイルを閉じる fclose( fp ) ; // 成功なら 0 を返す return 0 ; } // ファイル読み込み用コールバック関数 int FileReadFunc( const TCHAR *FilePath, void **FileImageAddr, int *FileSize, void *FileReadFuncData ) { return LoadFile( FilePath, FileImageAddr, FileSize ) ; } // ファイル解放用コールバック関数 int FileReleaseFunc( void *MemoryAddr, void *FileReadFuncData ) { // 確保したメモリの解放 free( MemoryAddr ) ; return 0 ; } // WinMain 関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; void *FileImage ; int FileSize ; ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 3Dモデルファイルの読み込み LoadFile( "DxChara.x", &FileImage, &FileSize ) ; // メモリ上に読み込んだ3Dモデルファイルから3Dモデルを作成 ModelHandle = MV1LoadModelFromMem( FileImage, FileSize, FileReadFunc, FileReleaseFunc, NULL ) ; // 画面に映る位置に3Dモデルを移動 MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 300.0f ) ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // キーの入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: 独自のフォーマットから3Dモデルハンドルを作成する方法 ( No.2 )
名前:nn解決済 日時:2017/04/30 23:51

お早いご回答ありがとうございます!MV1LoadModelFromMemの説明も貼ってくださって非常に助かります。 以前xファイルへの変換を他ソフトにて実行したときに不具合が多発して以来xファイルに関しては手付かずでしたが、 ここらへんは自前の変換プログラムを組んでなんとかモデル関連のファイル群の整理をしてみます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存