頭と尻尾はくれてやる!

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


ARKitのARFaceGeometryでのメッシュの切られ方を確認する

ARFaceGeometryのプロパティには
triangleCount
triangleIndices
などがあり、これを使うとどの頂点を使い三角形を表示しているのかがわかる。
{
    const int16_t *triangleIndices = arFaceGeometry.triangleIndices;

    for (NSUInteger ite=0;ite<10;ite++) {
        NSUInteger itex3 = ite * 3 ;
        NSLog(@"%d,%d,%d",triangleIndices[itex3],triangleIndices[itex3+1],triangleIndices[itex3+2]);
}
↑例えばこのようなコードで最初の10個の三角形を構成する頂点の頂点番号を表示させてみる。

頂点番号の出力結果

↑出力結果。
頂点番号がわかれば、verticesプロパティからその頂点の座標がわかる。残念ながら法線情報はなさそう。


メッシュの切り方を確認するため、三角形を構成する3つの頂点から3つの直線を描く。
triangleIndicesが持つ1つの三角形に関する情報は上記のように3つの頂点の頂点番号だ。直線を描くには始点と終点それぞれ頂点番号の二つが必要。なので、あらかじめそのようなデータ列を作成しておく。
int16_t *lineVertexIndices;//インスタンス変数

{
    lineVertexIndices = calloc(arFaceGeometry.triangleCount*6, sizeof(int16_t));
    const int16_t *triangleIndices = arFaceGeometry.triangleIndices;
    for (NSUInteger ite=0;ite<arFaceGeometry.triangleCount;ite++) {
        NSUInteger itex3 = ite * 3 ;
        NSUInteger itex6 = ite * 6;
        lineVertexIndices[itex6+0] = triangleIndices[itex3+0];//始点1
        lineVertexIndices[itex6+1] = triangleIndices[itex3+1];//終点1
        lineVertexIndices[itex6+2] = triangleIndices[itex3+1];//始点2
        lineVertexIndices[itex6+3] = triangleIndices[itex3+2];//終点2
        lineVertexIndices[itex6+4] = triangleIndices[itex3+2];//始点3
        lineVertexIndices[itex6+5] = triangleIndices[itex3+0];//終点3
    }
}
↑なおこの処理は毎フレーム行う必要はない。

以下のようなコードでたくさんの線を持つ1つのSCNNodeオブジェクトを作成できる。
+(SCNNode *)makeTriangleLinesNodeFor_simd_float3:(simd_float3 *)positions
                                     nofDots:(NSUInteger)nofDots
                             lineVertexIndices:(int16_t *)lineVertexIndices
                                nofTriangles:(NSUInteger)nofTriangles
{
    NSData *data = [NSData dataWithBytes:positions length:sizeof(float)*4*nofDots];// simd_float3は4要素あるのでx4
    
    SCNGeometrySource *vertexSource = [SCNGeometrySource
                                       geometrySourceWithData:data
                                       semantic:SCNGeometrySourceSemanticVertex
                                       vectorCount:nofDots
                                       floatComponents:YES
                                       componentsPerVector:3
                                       bytesPerComponent:sizeof(float)
                                       dataOffset:0
                                       dataStride:sizeof(float)*4];
    
    NSData *indexData = [NSData dataWithBytes:lineVertexIndices length:sizeof(int16_t)*nofTriangles*6];
    
    SCNGeometryElement *element = [SCNGeometryElement geometryElementWithData:indexData primitiveType:SCNGeometryPrimitiveTypeLine primitiveCount:nofTriangles*3 bytesPerIndex:sizeof(int16_t)];
    
    SCNGeometry *triangleLines = [SCNGeometry geometryWithSources:@[vertexSource] elements:@[element]];
    
    SCNNode *triangleLinesNode = [SCNNode nodeWithGeometry:triangleLines];
    
    return triangleLinesNode;
}
↑実行結果はこんな感じ。



スポンサーサイト

<< SceneKitのカメラのprojectionTransformにやられた  TopPage  iOS版のドラクエ4を買った >>

コメント


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

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1282-5ff22c8f




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

FC2Ad