垂直面検出(壁など)を実装するにはどうすればよいですか?
let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal //TODO
編集:これは、ARKit 1.5(iOS 11.3)でサポートされるようになりました。単に.vertical
を使用します。過去の目的のために、以前の投稿を下に保管しました。
垂直面検出は、(まだ)ARKitに存在する機能ではありません。 .horizontal
は、この機能が作業中であり、将来追加される可能性があることを示唆しています。単なるブール値である場合、これは最終的なものであることを示唆します。
この疑いは、WWDC17のAppleエンジニアとの会話で確認されました。
水平方向ではなく垂直方向の方向が無限に多いため、この実装を作成するのは難しいと言えますが、rodamnのように、おそらくそうではありません。
From rodamn’s comment:最も単純な場合、平面は3つの同一平面上の点として定義されます。サーフェスに沿って(垂直、水平、または任意の角度で)検出された十分なコプラナーフィーチャが検出されると、サーフェス候補ができます。水平線の法線は上下軸に沿っているだけで、垂直線の法線は地面に平行です。課題は、装飾されていない乾式壁は視覚的な特徴をほとんど生成しない傾向があり、普通の壁は検出されないことが多いことです。これが.vertical
機能がまだリリースされていない理由だと強く思います。
ただし、thisにはカウンター引数があります。詳細については、ricksterのコメントを参照してください。
このサポートはiOS 11.3で提供されます:
static var vertical: ARWorldTrackingConfiguration.PlaneDetection
セッションは、重力に平行なサーフェスを検出します(他の方向に関係なく)。
https://developer.Apple.com/documentation/arkit/arworldtrackingconfiguration.planedetectionhttps://developer.Apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection/2867271-vertical
Appleは、ARKit 1.5を含むARのさまざまなアップデートを備えたiOS 11.3をリリースしています。このアップデートでは、ARKitには、ARKitが仮想オブジェクトを認識し、壁やドアなどの垂直面に配置する機能が含まれています。
ARWorldTrackingConfigurationでバーティカルのサポートがサポートされるようになりました
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
sceneView.session.run(configuration)
IPhone Xには前面向きの深度カメラが搭載されているため、背面向きのカメラが次のバージョンに搭載され、.vertical
機能がそれまで委任される可能性があります。
私はUnityでそれをしましたが、数学をする必要があります。
ランダムサンプルコンセンサスを使用して、ARkitによって返された点群から垂直面を検出します。これは、3つのポイントをランダムに選択して平面を作成し、それに一致するポイントをカウントして、どの試行が最適かを確認するループを持っているようなものです。
動いています。ただし、壁が無地の場合、ARkitは多くのポイントを返すことができません。そのため、多くの状況では機能しません。
Appleは、新しいiPhoneの追加のAR機能、つまりカメラの追加センサーに取り組んでいると言われています。これらのデバイス機能がわかっている場合、これが機能になる可能性があります。ここでいくつかの推測。 http://uk.businessinsider.com/Apple-iphone-8-rumors-3d-laser-camera-augmented-reality-2017-7 および別のソース https:// www .fastcompany.com/40440342/Apple-is-working-hard-on-an-iphone-8-rear-facing-3d-laser-for-ar-and-autofocus-source
ARKit 1.0には、テーブルや床などの水平面を検出する
.horizontal
enumの場合がありました。 ARKit 1.5以降にはPlaneDetection
の.horizontal
および.vertical
型プロパティがありますstructはOptionSet
に準拠していますプロトコル。
ARKit 2.0で垂直面検出を実装するには、次のコードを使用します。
configuration.planeDetection = ARWorldTrackingConfiguration.PlaneDetection.vertical
または、両方のタイプのプレーンに検出を使用できます。
private func configureSceneView(_ sceneView: ARSCNView) {
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical] //BOTH TYPES
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration)
}
また、デリゲート呼び出しを処理するためにARSceneManager
に拡張機能を追加できます。
extension ARSceneManager: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let planeAnchor = anchor as? ARPlaneAnchor else {
return
}
print("Found plane: \(planeAnchor)")
}
}