scn/daeファイルから3DオブジェクトをMetalで描画する
SCNGeometryからMDLMeshを作成する
↑ここで顔のメッシュをMetalで表示することに加え、簡単な形状を描くのはできてた。
なので今回はscnファイルのデータを表示させてみようとした。
Appleのサンプルコード(※1)にはscnファイルでいくつかの3Dオブジェクトがある。
これをプロジェクトに持ってきておき、読み込んで使う。

↑使うのはcoordinateOrigin.scnとする。このように三つの軸が表示するオブジェクト。
よって、(2)のようにすればSCNGeometryオブジェクトを取得でき、MDLMeshオブジェクトを作成できる、と思ったのだが、、、
なぜか(3)のチェックで止まるのだ(いや、実際にはNSAssertを入れてなくて落ちるでもなく単に表示されなくてなんでだ?!ってはまっていたんだが)。
調べるとこのcoordinateOrigin.scnファイルには最初のスクショにあるようにx,y,z軸の直線(実際には直方体)のオブジェクトが3つある。
SceneKitだとrootNodeの子として3つの軸オブジェクトがある、という構成なのだろう。

↑y軸に相当するオブジェクト(scnファイルの構成には最初にあったよね)が原点に表示されている。ローカル座標を持っているはずだが頂点データをシェーダに渡しただけなので当然無視されている。
つまり3軸分を表示させようとするとそれぞれの頂点データなどをからMDLMeshオブジェクトを3回作成しなければならないということか。しかもローカル座標を考慮して。
SceneKitだとそんなのはフレームワーク側がよきに計らってくれるわけだが、、、
なかなか面倒なので実際にやろうと思うとBlenderなどで1かたまりの頂点データを作成して、そのデータを使うのがいいのかもしれない。

↑試しにBlenderで1かたまりのデータとしてこのようなオブジェクトを作成し、daeファイルで出力。それを同様に処理する。

↑これなら表示は簡単に可能。
このあたりが現実的か。
※1 Appleのサンプルコード↓
Creating Face-Based AR Experiences | Apple Developer Documentation
↑ここで顔のメッシュをMetalで表示することに加え、簡単な形状を描くのはできてた。
なので今回はscnファイルのデータを表示させてみようとした。
Appleのサンプルコード(※1)にはscnファイルでいくつかの3Dオブジェクトがある。
これをプロジェクトに持ってきておき、読み込んで使う。

↑使うのはcoordinateOrigin.scnとする。このように三つの軸が表示するオブジェクト。
{ NSString *filePath = [[NSBundle mainBundle] pathForResource:@"art.scnassets/coordinateOrigin" ofType:@"scn"]; NSURL *fileURL = [NSURL fileURLWithPath:filePath]; SCNReferenceNode *node = [[SCNReferenceNode alloc] initWithURL:fileURL];—(1) [node load]; SCNGeometry *scnGeo = node.geometry;//—(2) NSAssert(scnGeo, @"scnGeo is nil!”);//—(3) mdlMesh = [MDLMesh meshWithSCNGeometry:scnGeo bufferAllocator:metalAllocator]; }(1)SCNReferenceNodeはSCNNodeのサブクラス。
よって、(2)のようにすればSCNGeometryオブジェクトを取得でき、MDLMeshオブジェクトを作成できる、と思ったのだが、、、
なぜか(3)のチェックで止まるのだ(いや、実際にはNSAssertを入れてなくて落ちるでもなく単に表示されなくてなんでだ?!ってはまっていたんだが)。
調べるとこのcoordinateOrigin.scnファイルには最初のスクショにあるようにx,y,z軸の直線(実際には直方体)のオブジェクトが3つある。
SceneKitだとrootNodeの子として3つの軸オブジェクトがある、という構成なのだろう。
{ SCNNode *rootNode = [node.childNodes firstObject]; SCNNode *childNode0 = [rootNode.childNodes objectAtIndex:0]; SCNGeometry *scnGeo = childNode0.geometry; }↑ということで、nodeの子供の下にある3つの内の最初のSCNNodeオブジェクトからSCNGeometryオブジェクトを取得すれば、、、

↑y軸に相当するオブジェクト(scnファイルの構成には最初にあったよね)が原点に表示されている。ローカル座標を持っているはずだが頂点データをシェーダに渡しただけなので当然無視されている。
つまり3軸分を表示させようとするとそれぞれの頂点データなどをからMDLMeshオブジェクトを3回作成しなければならないということか。しかもローカル座標を考慮して。
SceneKitだとそんなのはフレームワーク側がよきに計らってくれるわけだが、、、
なかなか面倒なので実際にやろうと思うとBlenderなどで1かたまりの頂点データを作成して、そのデータを使うのがいいのかもしれない。

↑試しにBlenderで1かたまりのデータとしてこのようなオブジェクトを作成し、daeファイルで出力。それを同様に処理する。

↑これなら表示は簡単に可能。
このあたりが現実的か。
※1 Appleのサンプルコード↓
Creating Face-Based AR Experiences | Apple Developer Documentation
スポンサーサイト