2017-08-04 10 views
3

私はARKitを使って小さなプロジェクトを進めています。私はタップでAR SceneViewにオブジェクトを追加し、ダブルタップでそれらを削除し、パンまたはドラッグでテーマをドラッグすることができます。ARKitでのSCNNodeの配置、ドラッグ、削除

オブジェクトを配置する最初のタップは問題なく動作していますが、ノードの削除とドラッグに関する問題があります。

削除とドラッグの主な問題は、実際にSCNNodeを「ホールド」またはクリックすることは非常に難しいことです。結果のほとんどは、私が追加したSCNNodeにはない。

2番目の問題は、ドラッグが少しばかげているということです。SCNNodeはドラッグでドラッグするほど大きくは動きません。

私はここにリンクされているgithubの上のプロジェクト、作成することを決定しました: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; 
    } 
} 

すべてのヘルプを非常に高く評価されるだろう。

ありがとうございます。

UPDATE: self.sceneView.debugOptions = ARSCNDebugOptionShowFeaturePoints; と私はオブジェクトをクリックしようとするとき、それはほとんどの時間のの1をつかんされるだろうが:

は、だから私は、私が使っていたので、つかんオブジェクトとの難しさがあったことが分かりましたこれらの特徴点。

-(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; 
    } 
} 

ので問題ではなく、以前にオブジェクト全体をつかんで、私はまだ、このオブジェクトの子をつかんし、あなたはそれが何らかの理由でラグように動きを強制的に子供をドラッグしようとすると思われます。だから私は、問題を解決するために親レベルを上げる必要があることを理解するために、試行錯誤を少ししなければならなかった。

これが役に立ちます。

+0

アップルのサンプルプロジェクト「拡張現実に仮想オブジェクトを配置する」を参照したい場合は、 https://stackoverflow.com/questions/45488881/arkit-set-aranchor- touch-based-on-touch-location#comment77981682_45510108プロジェクトのURL。これは間違いなく画面上のドラッグ部分をカバーしています。 – PDK

+0

"movedObject"とは何ですか?私は宣言を見ません。私はこれをすばやく実行しようとしています。これはこれまでのところです: @objc func panGesture(送信者:UIPanGestureRecognizer){ sceneView = sender.viewを! (sender.state == UIGestureRecognizerState.began){ 場合(!hitTest.isEmpty){ がsceneHitTestResult = hitTestを許可すれば せhitTest = sceneView.hitTest(pannedLocation) :ARSCNView はpannedLocation = sender.location(sceneViewで)聞かせて。最初! sceneView.scene.rootNode.chil = sceneHitTestResult.node.parent } } – humbleCoder

+0

movedObjectはヒットした場合に開始された状態で設定されたSCNNodeへの参照にすぎず、パンの状態が変更されたときに更新されますジェスチャー。基本的にはこの関数でのみ使用されます。 –

答えて

0

オブジェクトをドラッグするソリューションは、movedObjectを[[hitResult node] parentNode] parentNode] parentNode]に設定し、ドラッグがスムーズになりました。

関連する問題