2017-07-07 56 views
1

因此,我有權訪問sceneView.pointOfView,我希望讓AR體驗感覺就像我正在照亮閃光燈,直到我看到的物體變得光亮,然後指向它們。ARKit將SCNLight指向相機正在尋找的地方嗎?

我試圖創建這樣一個聚光燈:

let spotLight = SCNLight() 
spotLight.type = .spot 
spotLight.spotInnerAngle = 60 
spotLight.spotOuterAngle = 60 
let spotNode = SCNNode() 
spotNode.light = spotLight 
spotNode.position = position 

我當時以爲,加入光到pointOfView節點將使它所以光會用相機移動,這意味着它總是會提前閃耀光...

sceneView.pointOfView?.addChildNode(spotLight) 

這不起作用,對象顯示爲黑色,不亮。

我在做什麼錯?我想通過AR體驗讓燈光指向我所看到的,就像我拿着手電筒一樣,並且我正在向前閃光。

任何建議嗎?

回答

2

您是否在尋找虛擬手電筒來逼真地照亮相機饋送中的真實世界場景?這是一個非常高的訂單。

你基本上是在投影映射一個光錐到每個可見的真實世界的表面上,這需要檢測和建模這些表面,這比ARKit的水平面檢測要多得多。 (如果你想不真實地照亮真實世界的場景,你所需要做的就是在視圖的中間放置一個半透明的白色圓圈,也許會喜歡混合模式。更現實的,變化的大小,或到3D的距離,根據hit-testing你對AR場景視圖的中心的圓圈。)


你想照亮虛擬對象你」虛擬手電筒已經放置在AR?這很容易實現。事實上,您的代碼是實現這一目標的最佳途徑。可能的問題:

spotNode.position = position 

上面的代碼段沒有說明你在哪裏獲得這個位置。如果您希望將聚光燈節點連接到相機,則它應該是零矢量。也就是說,您希望它在攝像機節點的本地空間中具有中立位置。將此矢量設置爲非零值將使光源從相機位置偏移恆定的位移(可能會導致光線在場景中沒有任何用處)。

sceneView.pointOfView?.addChildNode(spotLight) 

根據此代碼運行時上,sceneView.pointOfView可能是零,所以你沒有真正執行addChildNode電話。在添加子項之前請檢查以確保攝像頭節點已存在。 (我試着將這段代碼添加到ARKit WWDC17 session的示例代碼中 - 如果將它放在它們的ARSCNView.setup()函數中,您應該看到所有虛擬對象都被明亮的聚光燈所完全遮住了。)

順便說一下,您不一定需要向pointOfView節點添加子節點以保持指示燈 - pointOfView節點可以同時連接攝像頭和指示燈。

+0

我最終將自己的聚光燈附加到了像您在最後提到的pointOfView。這使我能夠實現我想要的。謝謝。 – zumzum