2017-09-13 97 views
7

我使用ARKit來顯示3D對象。我設法將節點放置在用戶面前的真實世界中(也就是相機)。但是,當我放下它們時,我無法讓它們面對相機。ARKit將SCNNode面向相機

let tap_point=CGPoint(x: x, y: y) 
let results=arscn_view.hitTest(tap_point, types: .estimatedHorizontalPlane) 
guard results.count>0 else{ 
    return 
} 
guard let r=results.first else{ 
    return 
} 

let hit_tf=SCNMatrix4(r.worldTransform) 
let new_pos=SCNVector3Make(hit_tf.m41, hit_tf.m42+Float(0.2), hit_tf.m43) 

guard let scene=SCNScene(named: file_name) else{ 
    return 
} 
guard let node=scene.rootNode.childNode(withName: "Mesh", recursively: true) else{ 
    return 
} 
node.position=new_pos 
arscn_view.scene.rootNode.addChildNode(node) 

節點位於攝像機前方的平面上。但他們都在朝着同一個方向看。我想我應該輪換SCNNode但我沒有設法做到這一點。

回答

0

即使照相機移動,您是否希望節點始終面向相機?這就是SceneKit constraints的用途。 SCNLookAtConstraintSCNBillboardConstraint可以讓節點始終指向攝像頭。

你想讓節點在放置時面對相機,但是保持不動(這樣你可以移動相機並看到它的背面)?有幾種方法可以做到這一點。一些涉及有趣的數學,但更簡單的方法來處理它可能只是設計你的3D資產,使「前」總是在正Z軸方向。根據相機變換設置放置對象的變換,其初始方向將與相機匹配。

+0

第二個:)當我放置它時,我希望節點面對相機,然後將它保留在此處(並且可以移動)。 –

+0

當你說>設計你的3D資產時,我不明白你的意思,所以「前」總是在正Z軸方向。我有一個dae文件,我將其轉換爲xCode中的scn。節點位置是(0,0,0)。但我也把相機放在(0,0,0,0.9),以便將物體放在我面前。確定相機是否在節點層次結構中(我猜可能是一個子節點)可能很重要。 –

+0

當我放下它們時,節點總是位於相機的正前方,它們是可見的(沒有在相機後面)。如果我在房間中移動並放下幾個節點,它們都是相似的。當我放下第一個節點時,它正在「看着我」。但不是下一個。我不知道我說的是否清楚...:/ –

1

首先,讓相機的旋轉矩陣:

let rotate = simd_float4x4(SCNMatrix4MakeRotation(sceneView.session.currentFrame!.camera.eulerAngles.y, 0, 1, 0)) 

然後,結合矩陣:

let rotateTransform = simd_mul(r.worldTransform, rotate) 

最後,應用轉換到您的節點,鑄塑SCNMatrix4:

node.transform = SCNMatrix4(rotateTransform) 

希望有幫助

+0

什麼是「r.worldTransform」指的是什麼?我沒有看看它可能是什麼 –

+0

「r」只是TC的變量result.first,意思是用戶在屏幕上的第一個觸摸點(我假設在他們的touchesBegan方法中),文檔最好解釋它,worldTransform是「The轉換矩陣,它定義了交點的旋轉,相對於世界的平移和縮放。「 – modium

+0

啊,好的,我得到了世界變換是/的,只是不是從哪裏來的,謝謝! –