2017-07-13 30 views
14

Aynı anda hem ARKit hem de Scenekit öğrenme sürecindeyim ve bu biraz zor oldu.ARKit - Sahnede 'kamera' şu anki pozisyonunu alın

Bir ARWorldTrackingSessionConfiguration oturumu oluşturulduğunda, bir kullanıcının sahne oturumunda kullanıcının kamerasının konumunu almanın bir yolunu bilip bilmediğini merak ediyordum. Fikir, kullanıcının mevcut pozisyonuna doğru bir nesneyi canlandırmak istiyorum.

let reaperScene = SCNScene(named: "reaper.dae")! 
    let reaperNode = reaperScene.rootNode.childNode(withName: "reaper", recursively: true)! 
    reaperNode.position = SCNVector3Make(0, 0, -1) 
    let scene = SCNScene() 
    scene.rootNode.addChildNode(reaperNode) 

    // some unknown amount of time later 

    let currentCameraPosition = sceneView.pointOfView?.position 
    let moveAction = SCNAction.move(to: currentCameraPosition!, duration: 1.0) 
    reaperNode.runAction(moveAction) 

Ancak currentCameraPosition Etrafa kamerayı hareket ediyorum rağmen her zaman [0,0,0] gibi görünüyor. Ne yaptığım hakkında bir fikrin var mı? Sonunda Fikir Ben buna benzer bir şey yapıyor, o kamera önünde olduğu kadar görünmez bir küre etrafında nesneyi döndürmek ve sonra içine animasyon olurdu geçerli: Rotate SCNCamera node looking at an object around an imaginary sphere

(bu şekilde kullanıcı nesne onlara doğru animasyon görür) Herhangi bir yardım için teşekkürler.

cevap

14

Kendinizi ARSession.delegate olarak ayarlayın. Sizin oturumunuzda işlenen her çerçeve için ARFrame verecektir session(_:didUpade:) uygulayabilirsiniz. Çerçeve, kamera dönüşümü, döndürme ve konum bilgileri hakkında bilgi veren bir camera özelliğine sahiptir.

func session(_ session: ARSession, didUpdate frame: ARFrame) { 
    // Do something with the new transform 
    let currentTransform = frame.camera.transform 
    doSomething(with: currentTransform) 
} 

Düzenleme: @rickster belirttiği gibi her zaman session.currentFrame arayarak içinden akım ARFrame ve kamera konumunu elde edebilirsiniz. Bu sadece bir kez, örneğin kameranın bulunduğu bir düğümü hareket ettirmek istediğinizde kullanışlıdır, ancak kameranın konumuna güncellemek istiyorsanız, delegate yöntemini kullanmanız gerekir.

+1

Bu işleri aşağıdaki sınıfın dışına yapıştırmak gerekir, ama aynı zamanda oturumun 'currentFrame' alarak oturumu temsilci olmadan çerçeveleri alabilirsiniz özelliği. – rickster

+1

@rickster siz sıkısınız ve cevabı düzenledim, ancak genellikle diğer düğümlerin sizin konumunuzu değiştirerek, örneğin etrafınızı takip ederek tepki vermesini istiyorsunuz. Daha sonra yeni kamera pozlarında sürekli güncellemeler olmasını istersiniz. – orangenkopf

+1

Doğru. Noktası, uygulamanızın başka bir şekilde nasıl ayarlandığına bağlı olarak, ARKit'in size 60 fps hızında çerçeve sunabilmeniz ve bunları aldığınız anda görüntüleyebileceğiniz veya kendi işlem döngüsünü (en çok 60 fps) çalıştırabileceğinizi İhtiyacınız olan her seferinde bir çerçeve için ARKit. Her iki yolu da destekler, böylece hangisini isterseniz kullanın. – rickster

6

Ben çözüldüğü biliyorum ama bunun için biraz düzgün çözüme sahip .. bir işleyici temsilci yöntemi ekleme prefere olur .. o ARSCNViewDelegate bir yöntem var elbette

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) { 
    guard let pointOfView = sceneView.pointOfView else { return } 
    let transform = pointOfView.transform 
    let orientation = SCNVector3(-transform.m31, -transform.m32, transform.m33) 
    let location = SCNVector3(transform.m41, transform.m42, transform.m43) 
    let currentPositionOfCamera = orientation + location 
    print(currentPositionOfCamera) 
} 

yapamazsın varsayılan olarak .. kutudan iki SCNVector3 eklemek böylece

func +(lhv:SCNVector3, rhv:SCNVector3) -> SCNVector3 { 
    return SCNVector3(lhv.x + rhv.x, lhv.y + rhv.y, lhv.z + rhv.z) 
} 
+0

Neden rotasyon matrisinin çapraz girişlerini alıyorsunuz? Ve neden "konum", "yönelim + konum" a eşittir. Konum, örn.dönüşümün son sütunu. Üst sol 3x3 matrisi, yönlendirmeyi (ve muhtemelen ölçek ve kesme) içerir. Perdeyi, yaw ve ruloyu ayıklamak için farklı yöntemler vardır, fakat diyagonal bunlardan biri değildir. – kjyv

İlgili konular