我已经设置了世界起源在后面的相机使用ARKit。
arView.debugOptions = [.showFeaturePoints, .showWorldOrigin]
然后,我建立了一个虚拟对象到世界起源的中心位置,即(x,y,z) = (0,0,0)。
现在,我想用用户的眼球运动(从前面的摄像机)移动物体,同时测量来自世界的物体的位移角度。
用ARKit还是RealityKit都可以吗?
发布于 2022-08-04 03:42:17
偏角
通过实现三角atan2
函数,可以计算模型的偏差角(相对于世界起源(x:0,y:0,z:0)。为了实现面部表情的识别(控制模型的运动),使用the following technique。
在这里,我使用DispatchQueue.main.asyncAfter()
作为一种测试方法来移动模型。
要将弧度转换为度,我使用了Rad * 180 / PI
公式。
import RealityKit
import Combine
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
@IBOutlet var label: UILabel!
var model = ModelEntity()
var subs: [AnyCancellable] = []
override func viewDidLoad() {
super.viewDidLoad()
self.model = ModelEntity(mesh: .generateSphere(radius: 0.1))
self.model.position.z = -10
let transA = Transform(translation: [ 3, 0,-10])
let transB = Transform(translation: [ 1, 0,-4 ])
let transC = Transform(translation: [-1, 0,-2 ])
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.model.move(to: transA, relativeTo: nil, duration: 1)
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.model.move(to: transB, relativeTo: nil, duration: 1)
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.model.move(to: transC, relativeTo: nil, duration: 1)
}
}
}
let anchor = AnchorEntity(world: [0, 0, 0])
anchor.addChild(self.model)
arView.scene.anchors.append(anchor)
arView.scene.subscribe(to: SceneEvents.Update.self) { _ in
let orb: Float = atan2(self.model.position.x,
self.model.position.z)
self.label.text = "Angle: \(String(format: "%.1f"
(orb * 180 / -.pi)))"
}.store(in: &subs)
}
}
这是场景的楼层,也就是XZ平面。
角度的范围是-180...+180
。若要将范围规范化为0...360
,请使用相应的数学。
https://stackoverflow.com/questions/73217885
复制