ios - 在SCNView上启用用户交互后,如何让它只水平旋转?

标签 ios objective-c xcode scenekit sceneview

我是 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];

感谢您的帮助!

最佳答案

我不确定您是否可以使用 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)只水平旋转。

关于ios - 在SCNView上启用用户交互后,如何让它只水平旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41995816/

相关文章:

ios - SwiftUI:如何在取消计时器后重新启动它?

ios - 如何使注释看起来像当前位置指示符?

ios - 创建 NSManagedObject 子类后程序无法编译

ios - iOS Xcode:更新到Xcode 10.2后,未能找到适合类型IBSlimDeviceTypeiPdad2x错误的设备

ios - 如何在 Swift 应用程序中使用带有框架的 Realm(与 Ca​​rthage 一起安装)?

ios - 无法获取堆栈 View 来填充它的 super View

ios - Xcode 5-将​​按钮连接到不带文件所有者的操作

ios - 如何通过 iOS 应用程序中的 UIPickerView 实现 View 之间的转换?

objective-c - 将 CGRect 存储到 plist 时出现问题

swift - swift3 (xcode) 中的旋转和约束