首页 文章

ARKit 平面可视化

提问于
浏览
1

我希望能够可视化我的 ARKit 应用检测到的飞机。我怎么做?

这就是我想要做

1 回答

  • 2

    使用 SceneKit 和 Obj-C 在 Xcode 中创建一个新的 AR 项目,然后将它们添加到 ViewController.m:

    //as a class or global variable:
    NSMapTable *planes;
    
    //add to viewWillAppear:
    configuration.planeDetection = ARPlaneDetectionHorizontal;
    
    //to viewDidLoad:
    planes = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory
                                   valueOptions:NSMapTableWeakMemory];
    
    //new functions: 
    - (void)renderer:(id<SCNSceneRenderer>)renderer didAddNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor {
    if( [anchor isKindOfClass:[ARPlaneAnchor class]] ){
        [planes setObject:anchor forKey:node];
        ARPlaneAnchor *pa = anchor;
    
        SCNNode *pn = [SCNNode node];
        [node addChildNode:pn];
        pn.geometry = [SCNPlane planeWithWidth:pa.extent.x height:pa.extent.z];
        SCNMaterial *m = [SCNMaterial material];
        m.emission.contents = UIColor.blueColor;
        m.transparency = 0.1;
        pn.geometry.materials = @[m];
        pn.position = SCNVector3Make(pa.center.x, -0.002, pa.center.z);
        pn.transform = SCNMatrix4MakeRotation(-M_PI / 2.0, 1, 0, 0);
      }
    }
    
    - (void)renderer:(id<SCNSceneRenderer>)renderer didUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor {
    if( [anchor isKindOfClass:[ARPlaneAnchor class]] ){
        [planes setObject:anchor forKey:node];
    
        ARPlaneAnchor *pa = anchor;
        SCNNode *pn = [node childNodes][0];
        SCNPlane *pg = pn.geometry;
        pg.width = pa.extent.x;
        pg.height = pa.extent.z;
        pn.position = SCNVector3Make(pa.center.x, -0.002, pa.center.z);
      }
    }
    
    - (void)renderer:(id<SCNSceneRenderer>)renderer didRemoveNode:(nonnull SCNNode *)node forAnchor:(nonnull ARAnchor *)anchor{
    [planes removeObjectForKey:node];
    }
    

    您会看到半透明的平面,如果感觉如此,请为m.emission.contents提供纹理。

    或者获取Apple 在 Swift 中提供的示例应用程序

相关问题