ノードをシーンに追加し、カメラに対して位置を維持しながら向きや回転を維持したいシーンのこれまでのところ...SceneKit/ARKitシーンにノードを追加して位置を保持するが、向きや回転をリセットするには
私は画面をタップすると、シーンのアンカーをカメラのトランスフォームと同じ変換で追加します。そして、didUpdateNode
では、アンカーノードの位置情報が設定されているので、position.z = -0.5
というモデルを含む子ノードを追加します。モデルノードは、カメラの直前のシーンに追加され、カメラの回転プロパティを反映します。下向き角度で傾斜電話で、これはそうようになります。
アンカーノードの回転データによって影響を受けるモデルノードは、カメラと同じように回転されます。この特定のモデルはその側に現れます - 私はそれを心配していません、それはちょうどプレースホルダーです。また、上の赤いボタンを無視してください。これはデバッグ用です。
これまでのところ、とても良いです。
回転情報が基本的に「リセット」されているため、代わりにカメラと同じ高さに表示され、デフォルトの正面位置に向いています。カメラを別に回転させて部屋の周りを動かすと、別のモデルが異なる位置に追加されますが、同じ高さと同じ向きになります。
これは次のようなものです。私は単にオブジェクトを追加するために画面をタップしたと仮定し、標準の高さで表示され、カメラではなくシーンに関連する回転が表示されます。
私は、ノードのeulerAngles
、rotation
とorientation
プロパティで遊んで試してみたが、これが満足に動作させることはできません。ここで私は今のところ..私は空白のシーンを作成しているコードです、と私はモデルとして標準SceneKitプロジェクトからship.scn
を使用しています:
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView!
var anchors = [ARAnchor]()
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneView.delegate = self
// Show statistics such as fps and timing information
sceneView.showsStatistics = true
// Create a new scene
let scene = SCNScene(named: "scene.scn")!
// Set the scene to the view
sceneView.scene = scene
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Create a session configuration
let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal
// Run the view's session
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Pause the view's session
sceneView.session.pause()
}
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
if anchors.contains(anchor) {
// Create a new scene
let scene = SCNScene(named: "art.scnassets/ship.scn")!
let shipNode = scene.rootNode.childNode(withName: "ship", recursively: true)!
shipNode.position.z = -5
node.addChildNode(shipNode)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
if let currentFrame = sceneView.session.currentFrame {
let translation = matrix_identity_float4x4
let transform = simd_mul(currentFrame.camera.transform, translation)
let anchor = ARAnchor(transform: transform)
anchors.append(anchor)
sceneView.session.add(anchor: anchor)
}
}
}
}
モデルの位置について:正確に何をリセットしたいですか?飛行機があなたのカメラの高さに現れるようにしますか?一定の一定の高さで?飛行機は常にカメラの北に見えるのですか?カメラの前で?モデルの方向性について:カメラと無関係な定数(常に北、常に垂直)やミックス(常にカメラに直面している、常に垂直な)のようにしたいですか? – Guig
['SCNTransformConstraint'](https://developer.apple.com/documentation/scenekit/scntransformconstraint)を見てください。 – orangenkopf
@Guig理想的には、z座標が南から北へ、x座標が西から東へと変化する世界でフラット・プレーンを作成したいので、最初のノードでそれを作成しようとしています。私は北の位置に合わせて飛行機を得るための詳細を除外しました。なぜならそれはコアの位置が関係しているからです。それは次のステップです。今は、床にまっすぐに座っているかのように、横向きで、回転しないで横になっている必要があります。 – Andrew