トップページ > 記事閲覧
DxLibを改造してvrmファイルを表示出来る様にしたい
名前:猫の湯飲み 日時: 2024/01/27 01:29

DxLibを改造してvrmファイルをassimpで読み込んで表示したいと考えております。 DxLibを改造する上で質問が3つあります 1. MV1LoadModelでvrmを読み込めるように変更する場合、DxModel.cppにあるMV1LoadModelFromMem_Staticに NewBaseHandle = MV1LoadModelToVRM(&LoadParam, ASyncThread); の様に呼び出せるように実装すればいいのでしょうか? 2.MV1LoadModelToVRMでMV1_MODEL_LOAD_PARAMとMV1_MODEL_R構造体に頂点などの必要なデータを入れていく感じでいいのでしょうか? 3. テクスチャの読み込みはMV1_TEXTURE_Rにテクスチャのパスを入れ、 MV1AddTextureBase内の __MV1LoadTextureで読み込むと認識しています。 ですがvrmファイルはテクスチャもすべて一つのファイルにまとめられており、 assimpではvrmファイルから展開したメモリ上にある ARGB8888 のテクスチャを取得できる形になっています。 この場合、LOADGRAPH_GPARAMにデータを入れていく形でいいのでしょうか?
メンテ

Page: 1 |

Re: DxLibを改造してvrmファイルを表示出来る様にしたい ( No.1 )
名前:管理人 日時:2024/01/27 17:16

> 1. MV1LoadModelでvrmを読み込めるように変更する場合、DxModel.cppにあるMV1LoadModelFromMem_Staticに > NewBaseHandle = MV1LoadModelToVRM(&LoadParam, ASyncThread); > の様に呼び出せるように実装すればいいのでしょうか? はい、その通りです > 2.MV1LoadModelToVRMでMV1_MODEL_LOAD_PARAMとMV1_MODEL_R構造体に頂点などの必要なデータを入れていく感じでいいのでしょうか? はい MV1LoadModelToMQO や MV1LoadModelToPMD を参考にしていただければ良いかと思います > 3. テクスチャの読み込みはMV1_TEXTURE_Rにテクスチャのパスを入れ、 MV1AddTextureBase内の __MV1LoadTextureで読み込むと認識しています。 > ですがvrmファイルはテクスチャもすべて一つのファイルにまとめられており、 > assimpではvrmファイルから展開したメモリ上にある ARGB8888 のテクスチャを取得できる形になっています。 1 のご質問では一般的な3Dモデル読み込み関数である MV1LoadModel ではなく、メモリ上に読み込まれた 3Dモデルファイルイメージから読み込む MV1LoadModelFromMem を使用されるとのことですので、 MV1LoadModelFromMem の引数 FileReadFunc でテクスチャの読み込みが指定された際にメモリ上にあるテクスチャを tga形式のファイル等に偽装して渡して頂ければ問題なく読み込めると思います MV1LoadModelFromMem の使い方についての解説がかなり過去のログになってしまったので、 こちらに実装当時の解説を載せます -------------------------------------------------------------------------------------------------------------------------- // メモリ上のモデルファイルイメージと独自の読み込みルーチンを使用してモデルを読み込む 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: DxLibを改造してvrmファイルを表示出来る様にしたい ( No.2 )
名前:猫の湯飲み 日時:2024/01/28 18:46

DxLibをビルドして使用するプロジェクトでテストする場合 ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4013 にあるようにvisual studio2022でビルドする時でも DxLib.lib -> DxLib_vs2015_x64.lib にリネームしなければならないのでしょうか? またリネームしなくても使用するプロジェクトでテスト出来る様にするにはどうすればいいでしょうか?
メンテ
Re: DxLibを改造してvrmファイルを表示出来る様にしたい ( No.3 )
名前:管理人 日時:2024/01/28 23:19

> DxLibをビルドして使用するプロジェクトでテストする場合 > ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4013 > にあるようにvisual studio2022でビルドする時でも > DxLib.lib -> DxLib_vs2015_x64.lib > にリネームしなければならないのでしょうか? はい、その通りです > またリネームしなくても使用するプロジェクトでテスト出来る様にするにはどうすればいいでしょうか? こちらにDXライブラリのソースファイルをプロジェクトに追加してビルドして試す用の プロジェクトをアップしました https://dxlib.xsrv.jp/temp/DxLibSourceTest_WithUseCLib.zip こちらのプロジェクトのようにDXライブラリのソースファイルを全部プロジェクトに追加して頂ければ ( あと、このプロジェクトの include設定と同じように必要なフォルダへの include設定をしていれば ) libファイルを介さずに直接DXライブラリへの変更をプロジェクトに反映しながらテストすることが出来ますので よろしければお試しください m(_ _)m
メンテ

Page: 1 |

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

   クッキー保存