SCNCylinder
を使用して、SceneKitでフラットな円柱を作成しようとしています。ユーザーがスクリーンをタップする位置で、シリンダーをシーンに配置したい。SceneKitの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];
}