頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


Blenderで作成したdaeファイルをNSXMLParserでパースしたい

macOSアプリでdaeファイルの中身を調べたいことがあった。daeファイルって、基本xmlファイルだからテキストエディターなんかで中身を見ることができる。
NSXMLParserを使えば中身を取得できるのだが

daeをXcodeにインポート

↑このようにdaeファイルをXcodeにインポートした場合はうまくできなかった(外部に置いている場合(※1)はできてた)。

やりたいことは、
(A)SceneKit(※2)で使い、かつ
(B)daeファイルをパース
を両立させたいわけだ。

Bのパースするためのコードはこんな感じ↓
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@“frog5” ofType:@“dae”];
    NSURL *targetURL = [NSURL fileURLWithPath:filePath];//(※3)

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:targetURL];

}
ファイルの有無をチェックするとちゃんと有る、となるのだがパースができない。
手打ちで拡張子をxmlもしくはscnに変更するとパースは可能になったのだがAのSceneKitで使うことはできなくなる。

Convert to dae to scn

↑ならば、とdae→scnにちゃんと(?)Xcodeの機能
Editor / Convert to SceneKit scene file format (.scn)
で変換してやると、、、当然SceneKitで使えるが、パースができなくなった。

ならば、とdae→NSStringにすればNSXMLParserの
initWithData:
でパースできんじゃね?と思ったけどdaeファイルの文字列を取得できなかった(※4)。


結局、ABを両立させることはできなかった。
回避策としては、一度どこかにdaeファイルを保存してからそれを読み込むか、Xcodeインポート時にdaeとxmlの二つ作成するか(試してないので動くか不明)。まあどちらにせよダサい、ダサすぎる、、、



※1
外部のdaeファイルを指定するコード。
↓これだと問題ない(ABともいける)。
{
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:targetURL];//パース可能
}
※2
daeファイルをSceneKitで使うのに↓のようにしてSCNSceneオブジェクトを得る必要がある。
{
    SCNScene *daeScene = [SCNScene sceneNamed:daeFileName];
}
しかしこの形式で使えるファイル形式は定められていてリファレンスによると↓のようになってる。
SCNSceneリソース形式

※3
↓この方法でNSStirng→NSURLに変換すると動かないってのは何回もはまってきたんだけど今回の問題はこれじゃない。
{
    NSURL *targetURL = [NSURL URLWithString:filePath];
}

※4
↓これだとdaeファイルの文字列を取得できなかった。
{
    NSString *content = [NSString stringWithContentsOfFile:filePath
                                                  encoding:NSUTF8StringEncoding
                                                     error:&error];
}



macOS High Sierra 10.13.6
Xcode 9.4.1
スポンサーサイト

<< ファミリー共有してるアプリのアプデができなくなった  TopPage  KerasでのTensorBoard関連の設定をする >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1180-7479db1f




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad