2017-07-07 5 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

関連する問題