2017-05-02 14 views
0

私はSceneKitを使用して.objファイルを表示します。しかし、.objファイルを取得するにはセンサーからSDKを使用するので、このセンサーは人間の腕をスキャンし、その結果として.objファイルを返します。しかし、私が.objファイルをロードするときには、適切な部分(椅子の一部、表面の一部など)がたくさんあるので、オブジェクトのこれらの部分を削除する必要があります。男の腕。iOSは.objファイルから面と頂点を削除します

たとえば、矩形または球を選択し、この球内のすべての頂点および面を削除したいとします。

iOSにSDKやフレームワークがありますか?

P.S.私はninevehといくつかの他のフレームワークを試しましたが、オブジェクトを見ることしかできず、編集できません。

編集

IはSceneKitに(それが異なる子ノードから頂点をマージ)の頂点を操作するためのコードを発見しました。 同じアプローチを使用して、削除する必要のある頂点を見つけることができます(これは、長方形内にあります)か、65K頂点では非常に遅くなりますか?

// 
 
// VertexManager.m 
 
// Test 
 
// 
 

 
#import "VertexManager.h" 
 
#import <SceneKit/SceneKit.h> 
 
#import <GLKit/GLKit.h> 
 

 
@implementation VertexManager 
 

 
+ (SCNNode *) flattenNodeHierarchy:(SCNNode *) input 
 
{ 
 
    SCNNode *result = [SCNNode node]; 
 
    
 
    NSUInteger nodeCount = [[input childNodes] count]; 
 
    if(nodeCount > 0){ 
 
     SCNNode *node = [[input childNodes] objectAtIndex:0]; 
 
     
 
     NSArray *vertexArray = [node.geometry geometrySourcesForSemantic:SCNGeometrySourceSemanticVertex]; 
 
     SCNGeometrySource *vertex = [vertexArray objectAtIndex:0]; 
 
     
 
     SCNGeometryElement *element = [node.geometry geometryElementAtIndex:0]; //todo: support multiple elements 
 
     NSUInteger primitiveCount = element.primitiveCount; 
 
     NSUInteger newPrimitiveCount = primitiveCount * nodeCount; 
 
     size_t elementBufferLength = newPrimitiveCount * 3 * sizeof(int); //nTriangle x 3 vertex * size of int 
 
     int* elementBuffer = (int*)malloc(elementBufferLength); 
 
     
 
     /* simple case: here we consider that all the objects to flatten are the same 
 
     In the regular case we should iterate on every geometry and accumulate the number of vertex/triangles etc...*/ 
 
     
 
     NSUInteger vertexCount = [vertex vectorCount]; 
 
     NSUInteger newVertexCount = vertexCount * nodeCount; 
 
     
 
     SCNVector3 *newVertex = malloc(sizeof(SCNVector3) * newVertexCount); 
 
     SCNVector3 *newNormal = malloc(sizeof(SCNVector3) * newVertexCount); //assume same number of normal/vertex 
 
     
 
     //fill 
 
     NSUInteger vertexFillIndex = 0; 
 
     NSUInteger primitiveFillIndex = 0; 
 
     for(NSUInteger index=0; index< nodeCount; index++){ 
 
      
 
      @autoreleasepool { 
 
       node = [[input childNodes] objectAtIndex:index]; 
 
       
 
       NSArray *vertexArray = [node.geometry geometrySourcesForSemantic:SCNGeometrySourceSemanticVertex]; 
 
       NSArray *normalArray = [node.geometry geometrySourcesForSemantic:SCNGeometrySourceSemanticNormal]; 
 
       SCNGeometrySource *vertex = [vertexArray objectAtIndex:0]; 
 
       SCNGeometrySource *normals = [normalArray objectAtIndex:0]; 
 
       
 
       if([vertex bytesPerComponent] != sizeof(float)){ 
 
        NSLog(@"todo: support other byte per component"); 
 
        continue; 
 
       } 
 
       
 
       float *vertexBuffer = (float *)[[vertex data] bytes]; 
 
       float *normalBuffer = (float *)[[normals data] bytes]; 
 
       
 
       SCNMatrix4 t = [node transform]; 
 
       GLKMatrix4 matrix = MyGLKMatrix4FromCATransform3D(t); 
 
       
 
       //append source 
 
       for(NSUInteger vIndex = 0; vIndex < vertexCount; vIndex++, vertexFillIndex++){ 
 
        GLKVector3 v = GLKVector3Make(vertexBuffer[vIndex * 3], vertexBuffer[vIndex * 3+1], vertexBuffer[vIndex * 3 + 2]); 
 
        GLKVector3 n = GLKVector3Make(normalBuffer[vIndex * 3], normalBuffer[vIndex * 3+1], normalBuffer[vIndex * 3 + 2]); 
 
        
 
        //transform 
 
        v = GLKMatrix4MultiplyVector3WithTranslation(matrix, v); 
 
        n = GLKMatrix4MultiplyVector3(matrix, n); 
 
        
 
        newVertex[vertexFillIndex] = SCNVector3Make(v.x, v.y, v.z); 
 
        newNormal[vertexFillIndex] = SCNVector3Make(n.x, n.y, n.z); 
 
       } 
 
       
 
       //append elements 
 
       //here we assume that all elements are SCNGeometryPrimitiveTypeTriangles 
 
       SCNGeometryElement *element = [node.geometry geometryElementAtIndex:0]; 
 
       const void *inputPrimitive = [element.data bytes]; 
 
       size_t bpi = element.bytesPerIndex; 
 
       
 
       NSUInteger offset = index * vertexCount; 
 
       
 
       for(NSUInteger pIndex = 0; pIndex < primitiveCount; pIndex++, primitiveFillIndex+=3){ 
 
        elementBuffer[primitiveFillIndex] = offset + _getIndex(inputPrimitive, bpi, pIndex*3); 
 
        elementBuffer[primitiveFillIndex+1] = offset + _getIndex(inputPrimitive, bpi, pIndex*3+1); 
 
        elementBuffer[primitiveFillIndex+2] = offset + _getIndex(inputPrimitive, bpi, pIndex*3+2); 
 
       } 
 
      } 
 

 
     } 
 
     
 
     NSArray *sources = @[[SCNGeometrySource geometrySourceWithVertices:newVertex count:newVertexCount], 
 
          [SCNGeometrySource geometrySourceWithNormals:newNormal count:newVertexCount]]; 
 
     
 
     NSData *newElementData = [NSMutableData dataWithBytesNoCopy:elementBuffer length:elementBufferLength freeWhenDone:YES]; 
 
     NSArray *elements = @[[SCNGeometryElement geometryElementWithData:newElementData 
 
                  primitiveType:SCNGeometryPrimitiveTypeTriangles 
 
                  primitiveCount:newPrimitiveCount bytesPerIndex:sizeof(int)]]; 
 
     
 
     result.geometry = [SCNGeometry geometryWithSources:sources elements:elements]; 
 
     
 
     //cleanup 
 
     free(newVertex); 
 
     free(newNormal); 
 
    } 
 
    
 
    return result; 
 
} 
 

 
//helpers: 
 
GLKMatrix4 MyGLKMatrix4FromCATransform3D(SCNMatrix4 transform) { 
 
    GLKMatrix4 m = {{transform.m11, transform.m12, transform.m13, transform.m14, 
 
     transform.m21, transform.m22, transform.m23, transform.m24, 
 
     transform.m31, transform.m32, transform.m33, transform.m34, 
 
     transform.m41, transform.m42, transform.m43, transform.m44}}; 
 
    return m; 
 
} 
 

 

 

 
GLKVector3 MySCNVector3ToGLKVector3(SCNVector3 vector) { 
 
    GLKVector3 v = {{vector.x, vector.y, vector.z}}; 
 
    return v; 
 
} 
 

 
@end

答えて

0

あなたはブレンダー、マヤなどの3Dツールを使用したいと思う号は、マックス、またはチーター3Dを3DS。

+0

私は自分の答えに挿入したコードをチェックできますか?そのようにすることは可能か、それとも非常に遅くなるでしょうか? –

関連する問題