首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从世界上测量虚拟物体的位移角?

如何从世界上测量虚拟物体的位移角?
EN

Stack Overflow用户
提问于 2022-08-03 07:33:19
回答 1查看 379关注 0票数 1

我已经设置了世界起源在后面的相机使用ARKit。

代码语言:javascript
运行
复制
arView.debugOptions = [.showFeaturePoints, .showWorldOrigin]

然后,我建立了一个虚拟对象到世界起源的中心位置,即(x,y,z) = (0,0,0)。

现在,我想用用户的眼球运动(从前面的摄像机)移动物体,同时测量来自世界的物体的位移角度。

用ARKit还是RealityKit都可以吗?

EN

回答 1

Stack Overflow用户

发布于 2022-08-04 11:42:17

偏角

通过实现三角atan2函数,可以计算模型的偏差角(相对于世界起源(x:0,y:0,z:0)。为了实现面部表情的识别(控制模型的运动),使用the following technique

在这里,我使用DispatchQueue.main.asyncAfter()作为一种测试方法来移动模型。

要将弧度转换为度,我使用了Rad * 180 / PI公式。

代码语言:javascript
运行
复制
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,请使用相应的数学。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73217885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档