0

を使用して SceneKit でフラット シリンダーを作成しようとしていますSCNCylinder。ユーザーが画面をタップした位置のシーンに円柱を配置したい。

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

screenpos で SCNCylinder を作成するときのオフセット

私は現在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];
}
4

1 に答える 1

0

SCNSphereSceneKit のすべては、ポリゴンから作成されます。ポリゴンの数、つまりSCNSphereメッシュの粒度は、プロパティによって決まりsegmentCountます。

SCNSphereのドキュメンテーション

デフォルトでは、segmentCount値は 48 に設定されていますが、これはあまり細かく設定されていません。低い segmentCount で を実行するhitTest:と、実際のタッチ ポイントと比較してオフセットを持つポリゴンが取得されます。SCNSpheresegmentCount を (たとえば 96 に) 増やすと、水平方向と垂直方向のセグメントが増加し、オフセットが減少します。

を大きくするsegmentCountとパフォーマンスに影響することに注意してください。

于 2016-09-12T20:59:30.100 に答える