如何解决ARKit – 将框添加到锚点?
我想创建一个简单的对象(框)并将其显示在某个位置,但我所能找到的一切都是关于使用 renderer()
方法。
有没有更简单的方法来使用锚点?只需将锚点添加到我的 SCNBox
对象?
let rect = SCNBox(width: 10.0,height: 10.0,length: 10.0,chamferRadius: 0)
rect.firstMaterial?.diffuse.contents = UIImage(named: "test.png")
let anchor = ARWorldAnchor( /* ... created with 4 columns */ )
// here how to add the rect object to the anchor ?
session.add(anchor: anchor)
解决方法
ARKit |场景工具包
正如您在代码中所建议的,我在 ARWorldAnchor
类中创建了一个自定义锚点。要自动跟踪该锚点,您需要 renderer(_:didAdd:for:)
或 session(_:didAdd:)
实例方法告诉委托新的 AR 锚点已添加到会话中。这就是为什么当您希望跟踪锚点/锚点时,有必要在 ARKit/SceneKit 中使用 renderer(_:didAdd:for:)
和 renderer(_:didUpdate:for:)
。
import ARKit
class ViewController: UIViewController {
@IBOutlet weak var sceneView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
let config = ARWorldTrackingConfiguration()
sceneView.session.run(config)
let worldAnchor = ARWorldAnchor(column3: [0,-1,1])
sceneView.session.add(anchor: worldAnchor)
}
}
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer,didAdd node: SCNNode,for anchor: ARAnchor) {
guard let worldAnchor = anchor as? ARWorldAnchor else { return }
let myNode = SCNNode()
myNode.geometry = SCNBox(width: 0.1,height: 0.1,length: 0.1,chamferRadius: 0)
let path = "texture.jpg"
myNode.geometry?.firstMaterial?.diffuse.contents = UIImage(named: path)
node.addChildNode(myNode)
}
}
class ARWorldAnchor: ARAnchor {
init(column0: SIMD4<Float> = [1,0],column1: SIMD4<Float> = [0,1,column2: SIMD4<Float> = [0,column3: SIMD4<Float> = [0,1]) {
let transform = simd_float4x4(columns: (column0,column1,column2,column3))
let worldAnchor = ARAnchor(name: "World Anchor",transform: transform)
super.init(anchor: worldAnchor)
}
required init(anchor: ARAnchor) {
super.init(anchor: anchor)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
fatalError("Hasn't been implemented yet...")
}
}
RealityKit
您所说的更简单的方法是在 RealityKit 中。当您用 AnchorEntity
拴住一个盒子时,它将在运行会话期间自动跟踪。如您所见,与 ARKit/SceneKit 对相比,样板代码最少。
import UIKit
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
let box: MeshResource = .generateBox(size: 0.1)
var material = SimpleMaterial()
material.baseColor = try! .texture(.load(named: "texture.jpg"))
let entity = ModelEntity(mesh: box,materials: [material])
let anchor = AnchorEntity(world: [0,-1])
anchor.addChild(entity)
arView.scene.anchors.append(anchor)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。