2016-09-07 11 views
0

SCNCylinderを使用して、SceneKitでフラットな円柱を作成しようとしています。ユーザーがスクリーンをタップする位置で、シリンダーをシーンに配置したい。SceneKitのSCNCylinderをタッチ位置で作成することが正確でない

私の現在のアプローチは機能しますが、何らかの理由でシリンダーがタッチ位置に正確に配置されていません。画面の部分によっては、シリンダーがタッチ位置の中央にあることがあり、時にはかなりの量だけずれていることがあります。スクリーンショットが問題を十分に示してくれることを願っています。

Offset when creating SCNCylinder at screenpos

私は現在、カメラが設置されているSCNSphereを持っています。球で画面のタッチポイントをヒットテストすることで、ヒットテストに向かって光線を取得します。私はその後、レイの法線ベクトルをとり、ベクトルに沿って6を掛けたベクトルに沿ってシリンダを配置します。

誰もがこのアプローチの問題点を知っていますか?

これはどのように私は現在SCNCylinder作成:

- (IBAction)longPressGesture:(UILongPressGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateBegan) { 
     CGPoint location = [sender locationInView:self.sceneView]; 
     NSArray *hitTestResult = [self.sceneView hitTest:location options:nil]; 

     if (hitTestResult.count == 1) { 
      SCNHitTestResult *sphereHit = hitTestResult.firstObject; 
      // Get ray coordinates from local camera position 
      SCNVector3 localCoordinates = sphereHit.worldNormal; 
      localCoordinates = SCNVector3Make(localCoordinates.x * 6, localCoordinates.y * 6, localCoordinates.z * 6); 
      [self addCylinder:SCNVector3Make(localCoordinates.x, localCoordinates.y, localCoordinates.z)]; 
     } 
    } 
} 

- (void)addCylinder:(SCNVector3)position { 
    SCNCylinder *cylinder = [SCNCylinder cylinderWithRadius:0.5 height:0.01]; 
    SCNNode *cylinderNode = [SCNNode nodeWithGeometry:cylinder]; 

    // Create LookAt Contstraint 
    NSMutableArray *constraints = [NSMutableArray new]; 
    SCNLookAtConstraint *lookAtCameraConstraint = [SCNLookAtConstraint lookAtConstraintWithTarget:cameraNode]; 
    lookAtCameraConstraint.gimbalLockEnabled = YES; 
    [constraints addObject:lookAtCameraConstraint]; 

    // Turn 90° Constraint 
    SCNTransformConstraint *turnConstraint = [SCNTransformConstraint transformConstraintInWorldSpace:NO withBlock:^SCNMatrix4(SCNNode * _Nonnull node, SCNMatrix4 transform) { 
     transform = SCNMatrix4Mult(SCNMatrix4MakeRotation(M_PI_2, 1, 0, 0), transform); 
     return transform; 
    }]; 
    [constraints addObject:turnConstraint]; 

    cylinderNode.constraints = constraints; 

    cylinderNode.position = position; 

    SCNNode *rootNode = self.sceneView.scene.rootNode; 
    [rootNode addChildNode:cylinderNode]; 
} 

答えて

0

SceneKitのすべてのSCNSphereはポリゴンの外に作成されます。多角形の数、したがって粒度はメッシュで、segmentCountプロパティによって決まります。デフォルトでは

Documentation of SCNSphere

segmentCount値が非常に細かくきめされていない、48に設定されています。低いsegmentCountでSCNSpherehitTest:を実行すると、実際のタッチポイントと比較してオフセットを持つポリゴンが取得されます。 segmentCountを(例えば96に)増加させることにより、水平方向および垂直方向のセグメントが増加し、オフセットが減少する。

segmentCountを増やすと、パフォーマンスに影響が出ることに注意してください。

関連する問題