美文网首页ARKITSceneKit学习SceneKit
[SceneKit专题]5.3D空间的触摸事件

[SceneKit专题]5.3D空间的触摸事件

作者: 苹果API搬运工 | 来源:发表于2017-04-04 10:51 被阅读420次

    说明

    本系列文章是对<3D Apple Games by Tutorials>一书的学习记录和体会此书对应的代码地址

    SceneKit系列文章目录

    在平时开发中常用的touchesBegan方法在3D中仍然可用.
    只不过在3D空间内采用了射线检测方法来返回触摸到的物体.

    QQ20170404-104513@2x.png

    当有触摸事件发生时:

    1. 拿到用户触摸在屏幕上的位置.
    2. 转换到SCNView的坐标系中.
    3. 当触摸点在SCNView上时,发射一个射线,返回与该射线相交的一系列物体.
    override func touchesBegan(touches: Set<UITouch>, withEvent event:
    UIEvent?) {
    // 1 拿到触摸对象
      let touch = touches.first!
      // 2 转换坐标系
      let location = touch.locationInView(scnView)
      // 3 执行hitTest,发射射线,返回相交的物体
      let hitResults = scnView.hitTest(location, options: nil)
      // 4 
      if hitResults.count > 0 {
    // 5 取出最近的物体
        let result = hitResults.first!
        // 6 处理该节点
        handleTouchFor(result.node)
    }
    }
    

    相关文章

      网友评论

      • 郝嗨森:我在捕捉到平面后,在平面节点处添加了一个箱子节点,然后进行点击测试,发现不管是点击平面还是箱子都不是很精准,很多区域是明明点中了却没效果,而节点外一些区域反而可以获取点击。请问这可能是什么原因呢?
        UITouch *touch = [touches anyObject];
        CGPoint touchPoint = [touch locationInView:self.scnView];
        NSArray *hitResults = [self.scnView hitTest:touchPoint options:nil];
        if (hitResults.count > 0) {

        SCNHitTestResult *hit = [hitResults firstObject];
        NSLog(@"%@", hit.node);

        SCNNode *node = hit.node;
        NSLog(@"--平面--%@", self.planeNode);
        NSLog(@"--箱子--%@", self.boxNode);
        if ([node isEqual:self.planeNode]) {
        NSLog(@"点击了平面");
        }
        if ([node isEqual:self.boxNode]) {
        NSLog(@"点击了箱子");
        }
        }
        郝嗨森:@史前图腾 获取点击对象[touches anyObject]这里有问题吗?和swift中的touches.first是不是一样的,我用swift好像可以比较精准的获取到点击事件。
        郝嗨森:@史前图腾 点击同一位置,有时为空,有时可以响应
        苹果API搬运工:是手势不识别直接没反应,还是返回的结果为空?

      本文标题:[SceneKit专题]5.3D空间的触摸事件

      本文链接:https://www.haomeiwen.com/subject/mouaottx.html