2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Assimpでファイルパスに日本語が含まれるファイルも読み込めるようにしてみた

Posted at

趣味で作っている自作ゲームエンジン(もどき)がある程度組めたのでAssimp(ver 5.0.0)を導入してモデルを色々読み込んで遊んでいて、
ふとPMXモデルも読み込めたよな?と思いニコニ立体から適当にダウンロードして読み込ませたところ"Unable to load this asset ~~"といったエラーが発生するではないですか。
幸いAssimpはコード触りたい放題拡張し放題なのでパスに日本語が含まれている場合でもファイルを読み込めるよう改造してみました。
(何らかの意図があって現状のコードになっているはずなのでコードをイジる際は自己責任でどうぞ)

やったこと

とりあえずニコニコ動画ランキングで目についたMMD動画で使われていたアンジュカトリーナモデルをassimp_viewerで拝めるようにはしました。
(面倒だったのでファイル名に日本語を含むテクスチャの読み込み部分は修正していませんが)
Open Asset Import Library _ Viewer  [C__Users_nest_4869_Downloads_こんにゃく式アンジュ・カトリーナver1_こんにゃく式アンジュ・カトリーナver1_アンジュ・カトリーナ(頭身高め).pmx] 2019_12_06 0_06_37 (2).png
シェーダのせいでびっくりするほどモデルの見栄えが悪い..

肝心の変更箇所

assimp-5.0.0/code/Common/DefaultIOSystem.cppのExists、Open関数内の処理を下記のようにfopenに統一します。

DefaultIOSystem.cpp
// 83行目あたり

// ------------------------------------------------------------------------------------------------
// Tests for the existence of a file at the given path.
bool DefaultIOSystem::Exists(const char* pFile) const
{
    FILE* file = ::fopen(pFile, "rb");
    if (!file) return false;
    ::fclose(file);
    return true;
}

// ------------------------------------------------------------------------------------------------
// Open a new file with a given path.
IOStream* DefaultIOSystem::Open(const char* strFile, const char* strMode)
{
    ai_assert(strFile != nullptr);
    ai_assert(strMode != nullptr);
    
    FILE* file;
    file = ::fopen(strFile, strMode);
    if (!file) return nullptr;

    return new DefaultIOStream(file, strFile);
}

以上です、はい。

なぜわざわざWIN32ではコンパイル分岐でfopenの使用を避けるのかが自分では理解できない...

2
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?