頭と尻尾はくれてやる!

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


scn/daeファイルから3DオブジェクトをMetalで描画する

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

scnファイル中身

↑使うのは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オブジェクトを取得すれば、、、

オブジェクトを表示1

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

なかなか面倒なので実際にやろうと思うとBlenderなどで1かたまりの頂点データを作成して、そのデータを使うのがいいのかもしれない。

Blenderで作成したオブジェクト

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

オブジェクトを表示2

↑これなら表示は簡単に可能。
このあたりが現実的か。



※1 Appleのサンプルコード↓
Creating Face-Based AR Experiences | Apple Developer Documentation
スポンサーサイト

<< ARKitのface trackingはiPhoneが横向きでも可能  TopPage  ARKitで顔を描くのにMetalのMTKViewだと白っぽくならなかった >>

コメント


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

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1288-479aa7eb




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

FC2Ad