シーンにノードを追加して、カメラに対する位置を維持しながら、シーンの向き/回転を維持したいと考えています。今までどこにいた...
画面をタップすると、シーンにアンカーが追加され、カメラの変換と同じ変換が行われます。次にdidUpdateNode
、アンカー ノードの位置情報がセットアップされた で、モデルを含む子ノードを追加しますposition.z = -0.5
。モデル ノードは、カメラの真正面のシーンに追加され、カメラの回転プロパティをミラーリングします。電話を下向きに斜めに傾けると、次のようになります。
アンカー ノードの回転データの影響を受けるモデル ノードは、カメラと同じように回転します。この特定のモデルは横向きに表示されます - 私は気にしません。これは単なるプレースホルダーです。また、デバッグ用の上部にある赤いボタンも無視してください。
ここまでは順調ですね。
これの代わりに私が望んでいるのは、回転情報が本質的に「リセット」されるため、代わりにカメラと同じ高さに表示され、デフォルトの正面向きの位置に面することです。カメラを別の角度に回転させて部屋の中を移動すると、別のモデルが別の位置に追加されますが、同じ高さと同じ方向になります。
それはこのように見えるかもしれません。画面をタップしてオブジェクトを追加したところ、カメラではなくシーンに合わせて標準の高さと回転で表示されたと想像してください。
ノードのeulerAngles
、rotation
およびorientation
プロパティをいじってみましたが、満足に動作させることができません。これまでのコードは次のとおりです。空のシーンを作成ship.scn
し、標準の SceneKit プロジェクトをモデルとして使用しています。
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)
}
}
}
}