代码之家  ›  专栏  ›  技术社区  ›  Matt

立体声ARSCNview,使VR和AR混合

  •  2
  • Matt  · 技术社区  · 9 年前

    virtual reality augmented reality .

    我试着放两个 ARSCNView viewCotnroller 但似乎ARKit只能启用一个 ARWorldTrackingSessionConfiguration

    我研究了将一个视图的图形表示复制到另一个视图,但找不到。请帮我找到解决办法。

    我找到了这个链接,也许它能启发我们: ARKit with multiple users

    https://www.youtube.com/watch?v=d6LOqNnYm5s

    4 回复  |  直到 4 年前
        1
  •  5
  •   Han    8 年前

    下面的代码基本上就是哈尔所说的。我之前在github上写了几行代码,可能可以帮助您入门。(代码简单,没有桶变形,没有对窄视场的调整-尚未)。

    本质上,我们将同一场景连接到第二个ARSCNView(因此两个Arscn视图看到的是同一场景)。无需让ARWorldTrackingSessionConfiguration与2个ARSCNViews一起工作。然后,我们偏移它的视角,将其定位为第二只眼睛。

    https://github.com/hanleyweng/iOS-Stereoscopic-ARKit-Template

        2
  •  4
  •   Hal Mueller    9 年前

    这个 ARSession documentation 他说

    使用ARKit构建的每个AR体验都需要一个ARSession对象。如果您使用 ARSCNView 或

    ARSCNView 实例,使用 SCNView 分享这首歌 在他们之间。

    现在怎么做?

    还有一个问题是,立体视觉需要两个稍微不同的摄像机位置,每只眼睛一个。ARKit使用一个摄像头,放置在iOS设备的位置,所以你必须对其进行模糊处理。

    然后你必须处理每只眼睛不同的桶状失真。

    对我来说,这相当于编写我自己的自定义对象来拦截ARKit代理消息,将坐标转换为我从两个不同摄像机看到的坐标,并管理两个不同的SCNViews(而不是ARSCNViews)。或者使用一个ARSCNView(一只眼睛),拦截其帧更新,并将这些帧传递给SCNView(另一只眼睛)。

    把雷达归档,把号码贴出来,我会复制它。

        3
  •  2
  •   Andy Jazz    7 年前

    import UIKit
    import SceneKit
    import ARKit
    
    class ViewController: UIViewController, ARSCNViewDelegate {
    
        @IBOutlet weak var sceneView: ARSCNView!
        @IBOutlet weak var sceneView2: ARSCNView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            sceneView.delegate = self
            sceneView.showsStatistics = true
            let scene = SCNScene(named: "art.scnassets/ship.scn")!
            sceneView.scene = scene
            sceneView.isPlaying = true
    
            // SceneView2 Setup
            sceneView2.scene = scene
            sceneView2.showsStatistics = sceneView.showsStatistics
    
            // Now sceneView2 starts receiving updates
            sceneView2.isPlaying = true     
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            let configuration = ARWorldTrackingConfiguration()
            sceneView.session.run(configuration)
        }
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            sceneView.session.pause()
        }
    }
    

    .isPlaying 两者的实例属性 ARSCNViews .

    enter image description here

        4
  •  1
  •   Johnny Rockex    7 年前

    -(void)setup{
    
        //left
        leftSceneView = [ARSCNView new];
        leftSceneView.frame = CGRectMake(0, 0, w, h/2);
        leftSceneView.delegate = self;
        leftSceneView.autoenablesDefaultLighting = true;
        [self.view addSubview:leftSceneView];
    
        //right
        rightSceneView = [ARSCNView new];
        rightSceneView.frame = CGRectMake(0, h/2, w, h/2);
        rightSceneView.playing = true;
        rightSceneView.autoenablesDefaultLighting = true;
        [self.view addSubview:rightSceneView];
    
        //scene
        SCNScene * scene = [SCNScene new];
        leftSceneView.scene = scene;
        rightSceneView.scene = scene;
    
        //tracking
        ARWorldTrackingConfiguration * configuration = [ARWorldTrackingConfiguration new];
        configuration.planeDetection = ARPlaneDetectionHorizontal;
        [leftSceneView.session runWithConfiguration:configuration];
    }
    
    -(void)renderer:(id<SCNSceneRenderer>)renderer updateAtTime:(NSTimeInterval)time {
    
        dispatch_async(dispatch_get_main_queue(), ^{
    
            //update right eye
            SCNNode * pov = self->leftSceneView.pointOfView.clone;
    
            SCNQuaternion orientation = pov.orientation;
            GLKQuaternion orientationQuaternion = GLKQuaternionMake(orientation.x, orientation.y, orientation.z, orientation.w);
            GLKVector3 eyePosition = GLKVector3Make(1, 0, 0);
            GLKVector3 rotatedEyePosition = GLKQuaternionRotateVector3(orientationQuaternion, eyePosition);
            SCNVector3 rotatedEyePositionSCNV = SCNVector3Make(rotatedEyePosition.x, rotatedEyePosition.y, rotatedEyePosition.z);
    
            float mag = 0.066f;
            float rotatedX = pov.position.x + rotatedEyePositionSCNV.x * mag;
            float rotatedY = pov.position.y;// + rotatedEyePositionSCNV.y * mag;
            float rotatedZ = pov.position.z;// + rotatedEyePositionSCNV.z * mag;
            [pov setPosition:SCNVector3Make(rotatedX, rotatedY, rotatedZ)];
    
            self->rightSceneView.pointOfView = pov;
        });
    
    }
    
    推荐文章