FC2ブログ

頭と尻尾はくれてやる!

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


ARKitのARFaceGeometryから顔の頂点を描く

フロントカメラが得た画像を自分の顔のテクスチャ用にシェーダに渡したい(3)
↑この流れ。iPhoneのフロントカメラ(TrueDepth Camera)で遊ぶ。

ARKitのARFaceGeometryクラスにverticesというプロパティがある。
@property(nonatomic, readonly) const simd_float3 *vertices;
↑このようにsimd_float3で頂点の位置情報を取得できるらしい、と聞けばやはり表示させてみたい!と思うのでやってみた。

ARSCNViewDelegateメソッド内に記述する、とする。顔の頂点のアップデートやテクスチャをシェーダに渡す処理などは省略して点表示に関わる部分のコードがこんな感じ↓
-(void)renderer:(id<SCNSceneRenderer>)renderer didUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor
{
    if (dotsNode) {//—(1)
        [dotsNode removeFromParentNode];
    }

    ARFaceAnchor *faceAnchor = (ARFaceAnchor *)anchor;
    ARFaceGeometry *arFaceGeometry = faceAnchor.geometry;//—(2)
    //NSLog(@"arFaceGeometry.vertexCount = %ld",arFaceGeometry.vertexCount);//—(3)
    const simd_float3 *vertices = arFaceGeometry.vertices;//—(4)

    dotsNode = [MyUtility makeDotsNodeForSCNVectors:(SCNVector3 *)vertices nofDots:arFaceGeometry.vertexCount dotRadius:15.];//—(5)
    dotsNode.geometry.firstMaterial.diffuse.contents = [UIColor grayColor];
    [faceNode addChildNode:dotsNode];//—(6)

}
ここでdotsNodeはSCNNodeオブジェクト。
このdelegateメソッドがコールされるたびに(1)でdotsNodeを画面から消して、その後に描く処理を行っている。
(2)でARFaceGeometryオブジェクトを得ているが、、、変数名が微妙なのは自分でもわかっているのだが、ARSCNFaceGeometryクラスなんてのもあってそれぞれどうしたものか?と自分の中でまだ定まっていなかったりする。
頂点数は(3)のようなvertexCountプロパティで取得できる。現在のバージョンだと1220個。なおここでNSLogするとズラーっとコンソールに表示されてしまう。
(4)ここで頂点データを取得できる。
(5)は前記事で作成した点を描画する自作メソッド(※1)だ。SCNVector3*型にキャストしている。そうしないと
Incompatible pointer types sending 'const simd_float3 *' to parameter of type 'SCNVector3 *' (aka 'struct SCNVector3 *')
↑このような警告が出るので。まあどちらもfloat値がx,y,zの順に並んでいて単に先頭のポインタを渡しているだけだ。
(6)faceNodeは
- (SCNNode *)renderer:(id)renderer nodeForAnchor:(ARAnchor *)anchor;
メソッド内で指定する顔のSCNNodeオブジェクト。このオブジェクト、というかARFaceAnchorオブジェクト基準の座標系での座標を得ているのでこのfaceNodeにaddChildNode:する。

その結果がこちら↓ ↑やたー!表示できた!と喜び勇んでツイートしたんだけど、、、なんか頂点少なくね?左右対称じゃないし?どこかがおかしい、、、?

実際間違えていたんだけど、長くなるので続く。


※1 前記事はこちら↓
SceneKitで点を描く



<< sizeof(simd_float3)=16という罠  TopPage  SceneKitで点を描く >>

コメント


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

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1272-2f3aed3e




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

FC2Ad