放置,拖放和删除ARKit中的SCNNode

我正在使用ARKit开发一个小型项目。 我希望能够添加对象到我的AR SceneView点击,删除它们,双击,并拖动主题拖动。

初始点击放置对象工作正常,但我有一些与节点删除和拖动的问题。

移除和拖拽的主要问题是实际上“握住”或点击SCNNode是非常困难的。 大部分结果最终都不在我添加的SCNNode上。

第二个问题是,拖动是有点bug,SCNNode真的不像我的手指那样拖动。

我已经决定在github上创build一个项目,链接在这里: https : //github.com/theraad/ARAttempt

但是我也会发布我的代码来移除对象并在这里拖动对象:

-(void)handleRemoveObject:(UITapGestureRecognizer *)recognizer { NSLog(@"Long Press Fired"); CGPoint tapPoint = [recognizer locationInView:_sceneView]; NSArray <SCNHitTestResult *> *result = [self.sceneView hitTest:tapPoint options:nil]; if ([result count] == 0) { return; } SCNHitTestResult *hitResult = [result firstObject]; if (hitResult.node) { [[hitResult.node parentNode] removeFromParentNode]; } } -(void)moveObject:(UIPanGestureRecognizer *)recognizer { NSLog(@"Move object"); if (recognizer.state == UIGestureRecognizerStateBegan) { NSLog(@"Pan state began"); CGPoint tapPoint = [recognizer locationInView:_sceneView]; NSArray <SCNHitTestResult *> *result = [self.sceneView hitTest:tapPoint options:nil]; if ([result count] == 0) { return; } SCNHitTestResult *hitResult = [result firstObject]; if ([hitResult.node.name isEqualToString:@"candle"]) { movedObject = [hitResult node]; } else if ([[hitResult.node parentNode].name isEqualToString:@"candle"]) { movedObject = [[[hitResult node] parentNode] parentNode] parentNode]; } if (movedObject){ NSLog(@"Holding an Object"); } } if (recognizer.state == UIGestureRecognizerStateChanged) { NSLog(@"Pan State Changed"); if (movedObject) { CGPoint tapPoint = [recognizer locationInView:_sceneView]; NSArray <ARHitTestResult *> *hitResults = [_sceneView hitTest:tapPoint types:ARHitTestResultTypeFeaturePoint]; ARHitTestResult *result = [hitResults lastObject]; SCNMatrix4 matrix = SCNMatrix4FromMat4(result.worldTransform); SCNVector3 vector = SCNVector3Make(matrix.m41, matrix.m42, matrix.m43); [movedObject setPosition:vector]; NSLog(@"Moving object position"); } } if (recognizer.state == UIGestureRecognizerStateEnded) { NSLog(@"Done moving object homeie"); movedObject = nil; } } 

任何帮助将不胜感激。

谢谢。

更新:

所以我发现抓取对象的困难是因为我使用了: self.sceneView.debugOptions = ARSCNDebugOptionShowFeaturePoints; 而当我尝试点击一个对象时,大部分时间都会抓住这些特征点之一。

 -(void)moveObject:(UIPanGestureRecognizer *)recognizer { NSLog(@"Move object"); if (recognizer.state == UIGestureRecognizerStateBegan) { NSLog(@"Pan state began"); CGPoint tapPoint = [recognizer locationInView:_sceneView]; NSArray <SCNHitTestResult *> *result = [self.sceneView hitTest:tapPoint options:nil]; if ([result count] == 0) { return; } SCNHitTestResult *hitResult = [result firstObject]; movedObject = [[[hitResult node] parentNode] parentNode] parentNode]; //This aspect varies based on the type of .SCN file that you have } if (movedObject){ NSLog(@"Holding an Object"); } } if (recognizer.state == UIGestureRecognizerStateChanged) { NSLog(@"Pan State Changed"); if (movedObject) { CGPoint tapPoint = [recognizer locationInView:_sceneView]; NSArray <ARHitTestResult *> *hitResults = [_sceneView hitTest:tapPoint types:ARHitTestResultTypeFeaturePoint]; ARHitTestResult *result = [hitResults lastObject]; SCNMatrix4 matrix = SCNMatrix4FromMat4(result.worldTransform); SCNVector3 vector = SCNVector3Make(matrix.m41, matrix.m42, matrix.m43); [movedObject setPosition:vector]; NSLog(@"Moving object position"); } } if (recognizer.state == UIGestureRecognizerStateEnded) { NSLog(@"Done moving object homeie"); movedObject = nil; } } 

所以这个问题似乎并不是先前抓住整个物体,而是抓住了这个物体的一个孩子,当你试图拖动一个孩子的时候,它会迫使这个移动由于某种原因而变得迟缓。 所以我不得不做一些尝试和错误,以实现我必须提高父级水平来解决这个问题。

希望这可以帮助。

拖动对象的解决scheme是将movingObject设置为[[[hitResult节点] parentNode] parentNode] parentNode],拖动变得更加平滑。