頭と尻尾はくれてやる!

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


SCNGeometryからMDLMeshを作成する

ARKit + TrueDepth Cameraでface trackingなどをするのに、描画にSceneKitではなくMetalを使おうと試している。

Xcodeで新プロジェクトを作成する時に、Augmented Reality Appを選択、Content TechnologyでMetalを選択。
すると作成されるコードはMetalで描画する方法などとても参考になる。
この基本アプリは画面をタップすると空間に立方体を”置く”。この立方体の形状はMDLMeshクラスの
newBoxWithDimensions:segments:geometryType:inwardNormals:allocator:
メソッドで作成している。

最終的には顔のメッシュを表示したいので、ARSCNFaceGeometry(これはSCNGeometryのサブクラス)からデータを持ってくる必要がある。
ありがたいことにMDLMeshクラスには直方体や球のような基本形状以外に、
+ (instancetype)meshWithSCNGeometry:(SCNGeometry *)scnGeometry bufferAllocator:(id<MDLMeshBufferAllocator>)bufferAllocator;
というSCNGeometryオブジェクトから作成できるメソッドがある。
これを使えば顔の形状をMetalで描画できるのでは?という考えだ。

なので、まずは簡単なSCNBox(これもSCNGeometryのサブクラス)で直方体オブジェクトを作ってそれをMetalで描画してみようとしたのだが、、、
{
    SCNBox *scnGeo = [SCNBox boxWithWidth:0.1 height:0.1 length:0.1 chamferRadius:0.01];
    
    MDLMesh *mesh = [MDLMesh meshWithSCNGeometry:scnGeo
                                 bufferAllocator:metalAllocator]; 
}
Xcodeのエラーメッセージ

↑なぜかエラーがでる。
No known class method for selector 'meshWithSCNGeometry:bufferAllocator:'
だとー?君は何を言ってる?
#import <ModelIO/ModelIO.h>
#import <MetalKit/MetalKit.h>
#import <SceneKit/SceneKit.h>

↑ちゃんとインポートしてるし、メソッドのところで⌘+クリックするとちゃんと定義のところへ飛んで行くじゃないか?

しばらく調べてようやく気付いたのが、このメソッドはカテゴリで定義されてて別ファイルに記述されてる、、、
#import <SceneKit/ModelIO.h>
↑これを追加したらいけた!そういうことだったのね。
↑とりあえず、face trackingして顔のanchorにSCNBoxから作成したメッシュを表示させることはできた。
スポンサーサイト

<< ビット演算子のチルダ(~)って何やねん?  TopPage  SceneKitのカメラのprojectionTransformにやられた >>

コメント


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

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1284-fb62c94c




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

FC2Ad