• 締切済み

DirectXによるpmdファイルの読み込み

質問なのですが、現在DirectXでpmdファイルを読み込むプログラムを作成しているのですが サンプルプログラムで使用されていたpmdファイルを読み込むことには成功したのですが、 自分が使いたいLat式ミクを表示しようとするとフォルダの中に存在しているテクスチャが 見つからないと表示されアクセス違反が発生してしまいます。 なぜか指定されたデータは存在するのにプログラム側で「指定されたテクスチャファイルが見つかりません。」 と表示されるのか原因がわからず困っております。 読み込みのプログラムはこちらのサイトのpmdモデルの表示を参考にしました。 http://www2.ocn.ne.jp/~mhage/PIC_Trap/ データはソースコードが置いてある場所にモデル用のフォルダを作成しその中にすべて データを入れてあります。 パスの指定の方法は"関数の引数に("フォルダ名/モデル名.pmd")で指定しております。 ちなみにフォルダ内のデータをすべてソースコードが置いてるフォルダ直下に移した場合は表示されております . 環境 Windows7 VisualStudio2008 DirectXSDK November2007を使用しております

みんなの回答

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.7

># サイズ指定、間違えないようにご注意を。 と、注意を促していたのですが……予定通り間違えていたんですね。 まぁ、既に指摘されて修正されたようですが。

kita2115325
質問者

お礼

ありがとうございます。 この辺がまだまだ未熟で勉強しなおす必要性を再認識させられました。ただ、フォルダにアクセスできないバグについてはまだ解決できていなかったり、テクスチャは設定されていないマテリアルの場所についてや、PMD独自?のトゥーン系のテクスチャが読み込めていなかったりとサンプルに付属していた単純なモデルは読み込めるのですが、こういったPMD独自のものが入ってくるとダメみたいなので、再就職に向けた作品ということもありDXライブラリを使うことも視野に入れていきたいと思います。シェーダーについても2.0までは対応しているので、できる範囲で勉強しながら実装していきたいと思います。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.6

>しかし、またアクセス違反が発生し今度は >「D3DX: Lat/: アクセスが拒否されました。」 >と言われてしまいました。 ファイルとして正しくないものでも混じっていたのでしょう。 meshData.texture_filename[]にリストされているのはファイルとしてアクセスできるものだけですか? 「ファイル名の長さが1以上だったら読み込み」とかになっていませんか? # 今回、ディレクトリ名が入っていますから長さ0にはなりませんよ。

kita2115325
質問者

補足

値を見てみたたところ55のリストに対して4か所画像データが割り当てられていない配列の部分がありました。 またPMD独自のスフィアテクスチャファイルも入っているためもしかしたらこれが原因かなと考えております。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.5

>しかし、実行してみるとif (strcpy_s(&tex_filename[PathOffset], meshData.texture_filename[ii].c_str())) >の部分で 'strcpy_s' : 関数に 2 個の引数を指定できません。と出てきてしまうのですがサイズが取れていないのでしょうか? でしたら、リファレンスでも参照しましょうかね。 http://msdn.microsoft.com/ja-jp/library/td1esda9%28v=vs.90%29.aspx 今までは、 template <size_t size> errno_t strcpy_s(char (&strDestination)[size], const char *strSource); // C++ only でコンパイルされていた…ということでしょう。 第1引数の指定方法が変わってしまった為、サイズの取得ができなくなった。 ということになるので、 errno_t strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource); を使用するように変更…でしょうかね。 # サイズ指定、間違えないようにご注意を。 # まぁ、間違えたところでたぶんオーバーすることはないと思いますが。

kita2115325
質問者

補足

ありがとうございます if(strcpy_s(&tex_filename[PathOffset], sizeof(tex_filename), meshData.texture_filename[ii].c_str())) に修正することでコンパイルエラーはとれました。 しかし、またアクセス違反が発生し今度は 「D3DX: Lat/: アクセスが拒否されました。」 と言われてしまいました。 Latフォルダのプロティから確認したのですがすべてフルコントロールできるようになっておりなぜこうなってしまっているのか困っております・・・・・・ 何度も申し訳ありません。自分でももう少し調査してみたいと思います。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

「C言語何でも質問掲示板」でちょっと進展(?)したようですが…… Mesh::SetMesh() でディレクトリ名がナシのままファイルアクセスしようとするから、 「ファイルないよ」となるのでは? # D3DXCreateTextureFromFileEx()が失敗して例外投げるけど誰も受け取ってくれないからOSがプロセス停める。 毎回ディレクトリ名を連結しないと…とか考えているようですが…… ・カレントディレクトリを変更する。(あんましオススメは出来ない) とか、 ・ファイル名をコピーするときにコピー先をずらしておく。 とか…。 後者の方法だと… char tex_filename[256] = {0}; をループの外に出して、ディレクトリ名をあらかじめ設定。  strcpy_s(tex_filename, TEXT("Lat/")); コピー先のインデックスを記憶。  int PathOffset = strlen(tex_filename); で、ファイル名をコピーする処理でオフセット分ずらした位置から。  if (strcpy_s(&tex_filename[PathOffset], meshData.texture_filename[ii].c_str())) とやるとか。

kita2115325
質問者

補足

ありがとうございます。 TEXT("Lat/")の部分に関しましてはMesh::SetMesh()に引数を追加して取得するようにしました。 しかし、実行してみるとif (strcpy_s(&tex_filename[PathOffset], meshData.texture_filename[ii].c_str())) の部分で 'strcpy_s' : 関数に 2 個の引数を指定できません。と出てきてしまうのですがサイズが取れていないのでしょうか? 無知で申し訳ありません。 よろしければ原因と解決策を教えていただけないでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

念のため確認ですが 「モデル用のフォルダ」 をフルパスで書くとどうなりますでしょうか?

kita2115325
質問者

お礼

ありがとうございます。 そちらも試してみたのですがダメでした。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>上記の補足の通りカレントディレクトリはソースコードが入っているフォルダだと思われます。 「思われます」ではなく、GetCurrentDirectory()で確認してください。 また、パス区切りを/ではなく\にしてみた場合はどうですか? # 指摘するまでもありませんが\の場合のエスケープを忘れずに。 あと……DebugビルドとReleaseビルドで文字コードセットが違うのは意図通りってことでいいんですかね? なお、VCから起動する場合は明示的にカレントディレクトリが指定できますので、その辺りも観てみたらどうですかね。 # 先に回答したとおり、カレントディレクトリに依存するのは問題があることもありますけどね。 「C言語何でも質問掲示板」の方でも回答付くといいですな。

kita2115325
質問者

補足

ありがとうございます。 ブレークを置いて確認してみたところ "c:\Users\user\Documents\study\test\test" と出力されソースコードが入っているフォルダ(testフォルダ)がカレントディレクトリだと確認できました。 \も試してみたのですが結果は変わらずでした。 文字コードセットの違いは自分の設定ミスです。ご指摘ありがとうございます。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

>パスの指定の方法は"関数の引数に("フォルダ名/モデル名.pmd")で指定しております。 その指定方法は、『カレントディレクトリから』の相対パス指定になります。 ではカレントディレクトリはどこになっているのでしょう? ソースファイルのあるディレクトリ? 実行ファイルのあるディレクトリ? 実は固定していません。 # 正確には実行するときの状況次第です。 さらにカレントディレクトリはアプリケーションが起動してから終了するまでの間に変化する場合があります。 ということで、相対パス指定はあまりオススメできる方法ではありません。 # まぁ、普通はアプリ実行中にカレントディレクトリが変更されることはない…んですが…… # GetOpenFileName()等で変更される場合があります。 # http://msdn.microsoft.com/ja-jp/library/cc364716.aspx # http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839%28v=vs.85%29.aspx のOFN_NOCHANGEDIRの有無とか。 http://msdn.microsoft.com/ja-jp/library/cc429301.aspxhttp://msdn.microsoft.com/ja-jp/library/cc429764.aspx なんかも参照。 そんなワケで…… アプリケーション起動直後に実行ファイルのフルパス名を取得して、 実行ファイルのある場所をカレントディレクトリに設定し、そこからの相対パス指定でファイル/ディレクトリを指定するか、 実行ファイルのある場所を保持しておいて、ファイル/ディレクトリを指定する際に絶対パスを組み立てるか…とした方がよいかと。 # カレント指定する場合は上記の通り「意図せず変更される」という可能性は考慮しておく必要があります。

kita2115325
質問者

お礼

早速の回答ありがとうございます。 上記の補足の通りカレントディレクトリはソースコードが入っているフォルダだと思われます。 コードが長くすべて書くと大変なので下記の場所にアップいたしました。 http://firestorage.jp/download/1af77f8d4437bb833be18f4ccb63007ec1c13f67

kita2115325
質問者

補足

カレントディレクトリはプログラムのソースコードが入っているフォルダだと思われます。実際にソースコードが入っている場所にテクスチャなどすべてのデータを置いて("モデル名.pmd")とした時は読み込みに成功していましたので・・・・ なのになぜか相対パスにした時だけテクスチャがないといわれてしまうのです・・・・ 試に同じく表示させているXファイルのモデルをソースコードが入っているフォルダに新しくフォルダを作成しそこに移動させて("フォルダ名/モデル名.x")の場合は表示されました。

関連するQ&A