После включения взаимодействия с пользователем в SCNView, как сделать так, чтобы он вращался только горизонтально?

Я новичок в SceneKit, и я пытаюсь загрузить файл dae в SCNScene, установить SCNScene в SCNView, включить взаимодействие с пользователем, а затем я могу вращать 3D-модель с помощью жестов. Пока все идет хорошо, когда я провожу или увеличиваю / уменьшаю масштаб, 3D-модель работает так, как она должна быть. Тем не менее, что мне действительно нужно, так это то, что когда происходит жест (проведите пальцем вправо или влево), 3D-модель вращается только по горизонтали и без увеличения / уменьшения масштаба, что я могу сделать, чтобы это произошло? Вот мой код:

// retrieve the SCNView
SCNView *myView = (SCNView *)self.view;

// load dae file and set the scene to the view
myView.scene = [SCNScene sceneNamed:@"model.dae"];

myView.userInteractionEnabled = YES;
myView.allowsCameraControl = YES;
myView.autoenablesDefaultLighting = YES;
myView.backgroundColor = [UIColor lightGrayColor];

Спасибо за любую помощь!

1 ответ

Решение

Я не уверен, что вы можете сделать это с allowsCameraControl - кажется, что это очень базовое условие для взаимодействия с моделью.

Если вы добавите жест панорамирования в сцену, вы можете манипулировать любым узлом в модели, как вам угодно:

- (void)viewDidLoad {
    // Add the scene etc....

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
    [_sceneView addGestureRecognizer:panRecognizer];
}

- (void)panGesture:(UIPanGestureRecognizer *)sender {
    CGPoint translation = [sender translationInView:sender.view];

    if (sender.state == UIGestureRecognizerStateChanged) {
        [self doPanWithPoint:translation];
    }
}

- (void)doPanWithPoint:(CGPoint)translation {
    CGFloat x = (CGFloat)(translation.y) * (CGFloat)(M_PI)/180.0;
    CGFloat y = (CGFloat)(translation.x) * (CGFloat)(M_PI)/180.0;

    // Manuipulate the required (root?) node as you see fit
    _geometryNode.transform = SCNMatrix4MakeRotation(x, 0, 1, 0);
    _geometryNode.transform = SCNMatrix4Mult(_geometryNode.transform, SCNMatrix4MakeRotation(y, 1, 0, 0));
}

Очевидно, что вы можете пропустить второй шаг вращения (или установить y=0), чтобы вращаться только горизонтально.

Другие вопросы по тегам