• 締切済み

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

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

みんなの回答

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

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

kita2115325
質問者

お礼

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

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

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

kita2115325
質問者

補足

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

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答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% (2177/4070)
回答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% (2177/4070)
回答No.2

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

kita2115325
質問者

補足

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

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答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

  • MMDにスケッチアップをPMDでの導入について

    タイトルの通り、 スケッチアップで作成したCGをMMDにPMDの形で入れたいです。 他の質問で、 スケッチアップで完成した作品をdaeファイルで出力し、Blenderという3DCG制作ソフトで、 先ほどのdaeファイルを、xファイルにエクスポートさせ、PMD EditorでPMDで変換しようとしたのですが、 PMDで出力すると、テクスチャが反映されないので、 他の方法がないかと重い、質問しました。 回答できる方お願いしますm(_ _)m

  • exeファイルにドラッグすることで動作するプログラム

    現在、exeファイルのアイコンにデータファイルをドラッグすることで、プログラムを動かし、データファイルを読み込んで処理するプログラムをVisualC++2008ExpressEdtionで作成しています。 ここで質問が2つあります。 <質問1>  データファイル名に日本語(2バイトコード)が含まれている場合、CreateFile関数でエラーとなります。ファイル名に日本語を含む場合どのようにすればよいか教えてください。 <質問2>  現在作成しているプログラムでは、処理結果をファイルに出力しています。出力ファイルのフォルダをexeファイルのある場所にしたいのですが、プログラムコード上で相対パスで指定すると、上手く動きません(別フォルダに出力ファイルが作成されます)。ドラッグによってexeファイルを起動する場合、exeファイルのあるフォルダを知るにはどうしたらよいのでしょうか?

  • JAVA、pmd2xmlについて

    pmd2xmlについて質問です。 私は普段音楽をしておりますが、プログラム関係はさっぱりでかろうじてEXCELのマクロが組める程度です。 この度、コミpo!というソフトでカスタムしたデータ(xmlファイル)を、キャラみんというソフトで使用したいと考えていましたが、その際にxmlファイルをPMDファイルに変換しないといけません。 そこで、唯一引っかかった「pmd2xml」というJAVAのソフトを使おうと思ったのですが、正直何が書いてあるのかサッパリわかりません。 http://mikutoga.sourceforge.jp/pmd2xml.html 自分でやれたと思う事は ・環境変数にPATHを追加 ・JRE7のインストール です。 http://gyazo.com/5d076e8c5ffef1d45351f585cb1dcad0 どのようにコマンドプロンプトで入力をしてやればいいのでしょうか? jarファイル及び変換したいファイルは../ire7\bin内に入っています。 OSはwin7の64bitです。

  • [ PMDエディタ ] Xファイルが表示されない

    MMD初心者です。 PMDエディタを使って、アクセサリの色を変えて編集しているのですが、 ファイルを読み込むと、アクセサリの輪郭が真っ白な状態で、材質が表示されません。 材質の元となる画像ファイルも、アクセサリのxファイルと同じフォルダ内に保存してあります。 [ファイル] → [エクスポート] で出力しているので、手順は間違ってはいないと思うのですが… 手順が間違っている様でしたら、教えていただけたら助かります。 宜しくお願いします。

  • ファイル名での読み込み

    eclipseを使ってコードを書いているのですが、ファイルを読み込む時に指定されたファイルがありませんとエラー表示されます。 パスで指定した場合はうまくいくのですが、ファイル名だけで読み込めるようにしたいです。考えられる解決策はありますでしょうか?読み込むファイル自体はプログラムと同じpackageの中に保存しています。 ファイルを読み込む、そのファイルの内容を他のファイルに書き込むというプログラムです。どちらもtxtファイルです。

  • DirectXでの読み込みについて

    「DirectXを使ってノベルゲームを作っていこう」と思い現在作成中です。 そこで『ノベル』なのでテキストをたくさん表示させる必要があるのですが、ここで分からない事があります。 外部ファイル(~.txtなど)に予めテキストを用意しておき、ソース中で必要なテキストを読み込み表示させる事は可能でしょうか?(←また、表示させたテキストを消し、次のテキストを表示させる方法も分かりません。) 出来るようでしたら参考になるサイト、もしくは関数等を教えて下さい。 宜しくお願いします。

  • delphi5でのディレクトリ内ファイル名の取得

    こんにちは。質問があります。 delphiのアプリケーションであるディレクトリのフォルダ内のファイルを 別のディレクトリのフォルダ内に名前を変えてコピーしようと考えています。 基本的にコピー元のディレクトリ名はわかりません。 コピー先のディレクトリは存在しなければ、名前を指定して作成し、その中に名前を変更したファイルを格納する流れです (わかりづらいかも・・・) フォルダが存在しなければ作成したり、ファイル名を変更してコピーする のはわかったのですが、コピー元のディレクトリ内のファイル(もしくはディレクトリ)名を取得することがわかりません。 全てソースの中でプログラムしたいと考えています。(VCLは使用しない) こんなんでもわかっちゃったりする方がいらっしゃいましたら、 どうか愛の手を・・・

  • C#のファイル読み込みについて

    Visual C#を使用したプログラムを勉強中です。 今まではCOBOLでの開発しか、経験したことがありません つい先日から勉強を始め、現在ドリル式の参考書を読み終え 各種コントロール、コンポーネント、ダイアログなども ごく簡単なサンプルプログラムを使用して触ってみました。 つぎのステップとして、自作のプログラムを作成してみようと 考えていたのですが、最初の段階で躓いてしまったので 質問させていただきます。 仕様としては、csvファイルにて 「番号,名前,値1,値2,値3」というデータファイルを作成しておき それをアプリケーション起動時に読み込む TextBoxに文字を入力し、検索ボタンを押すことで データファイルの「名前」部分と一致したデータの内容(値1,値2...)を Label、もしくはTextBoxの指定した箇所にそれぞれ表示をさせようと考えています。 こういった仕様のプログラム(というより、C#での考え方)の場合 最初のデータ読み込みの段階で、csvファイルから配列にデータを 読み込んでおくのか、 検索ボタンを押した段階でファイルから読み込み該当項目を探すのか どちらが良いのでしょうか? データ件数が膨大な量でない限り、前者の方法が適しているのではないかとは 考えています。 また、よろしければ簡単にプログラムでの書き方も 併せて教えていただけると、とてもありがたいです・・・ 今現在のスキルとしては、ファイルの読み込みに関してはopenFileDialogを使用して ファイルを指定し、FileStreamを取得、streamReaderで読み込み richTextBoxに表示させる、というような処理しか理解できていません

  • エクスプローラーで、存在するファイルが表示されません

    エクスプローラーでファイル一覧を見たら、あったはずのファイルやフォルダの一部が消えていました。そこで、再度フォルダを作成しようとすると、「指定されたファイル名はすでに存在します」と言われて作成出来ません。また、消えてしまったものと同じファイルを別ドライブからコピーしようとすると、「このフォルダにはすでに<ファイル名>が存在します」の表示が出ます。 エクスプローラーの設定で、保護されたオペレーティングシステムファイルを表示しない」のチェックを外しても変わりません。 フォルダのプロパティを見ると、見られない一部のファイルは数に数えられていない状態です。 「復元」でドライブを検索しても、表示されないファイルは出てきません。 よろしくお願いします。

  • MMD ユーザー配布モデルが正しく機能しない

    最近MMDを始めた超ド級の初心者です。(PCも) そんな私がやっとの思いでMMD・PMDなどをダウンロードできました。 しかし、ユーザー配布のモデルを読み込み使ってみようと思ったのですが、表示がおかしくなってしまいます(テクスチャ未反映?)。詳しいことは以下に書いてあります。 ちなみに多数のモデルです。それらを色(デザイン?)がかぶらないようにしたいんです。 他のサイトも参考にしてみたのですが、やはりわかりません・・・ どなたかなるべく詳しく教えていただけないでしょうか?(疲) やってみたこと ・「model」に「配布モデル(1)」を直接ドロップし、なんとか読み込みできた(テクスチャ無し)→ 同封されていた「tex.tga(1)」を「model」に入れ、配布モデル(1)を読み込んだらちゃんと表示された(テクスチャ有り)→ もう一つ別のモデル(2)とtex.tga(2)を同様に「model」に入れる(tex~は置き換えせず両方入れている)→ モデル(1)と(2)を読み込むとモデル(1)のデザインがモデル(2)にも反映されている(tex~(2)が無効に。 被っているわけではない) ・「model」内のtex~(1)(2)を削除→ サイトを参考に「UserFile」の上にある「Data」に「tex~」を入れる(入れてから何かするようなことが書いてあったけれど、「ファイルを開けません」と表示される→選択肢が出る→ →「インストールされたプログラムの一覧から~」(沢山項目が出てきて、何を開けばいいかわからない) →「Webサービスを使用して正しいプログラムを~」→別ブラウザに飛ばされ、「ファイルを開くことができるソフトウェアの Web サイト: 「Paint Shop Pro 」・「Free File Viewer」などのダウンロードを進められる もうお手上げです(´;ω;`) 誰か助けてください  長々と書いていてわかりにくいと思いますが、やりたいことは単純に≪テクスチャをモデルに反映させる方法が知りたい(しかも複数別々に)≫ということです;

専門家に質問してみよう