首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将ModelEntity悬停在ARCamera前面

将ModelEntity悬停在ARCamera前面
EN

Stack Overflow用户
提问于 2022-07-17 15:51:44
回答 1查看 127关注 0票数 1

我试图使一个实体悬停在同一地点的相机前,无论我如何移动设备,我没有成功。我想,我想围绕y(横向移动-偏航)和x(垂直平移-螺距)旋转。

我从ARCamera得到相机的旋转:

代码语言:javascript
复制
 let distance: Float = 2               // distance in front of camera
 let euler = camera.eulerAngles
 let yaw = euler.y + .pi
 let x = sin(yaw) * distance
 let z = cos(yaw) * distance
 let translation = SIMD3<Float>(x, 1, z)

 let transform = Transform(scale: .one, 
                        rotation: simd_quatf(), 
                     translation: translation)

 entity.transform = transform

首先,我不清楚为什么我需要通过.pi旋转,将实体保持在摄像机前面。我是否正确地认为相机的转换被初始化到相机最初指向的位置,因此如果相机没有移动,实体就应该在摄像机前面吗?

其次,如果我尝试在x轴周围执行类似的操作,这一切都失败了:

代码语言:javascript
复制
 let pitch = euler.x + .pi
 let y = sin(pitch) * distance
 let z = cos(pitch) * distance
 let translation = SIMD3<Float>(1, y, z)

很明显我对我在这里做什么感到困惑。有人能把我弄直吗?谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-07-23 16:19:36

轨道三角学

试试这段代码来实现一个永恒的轨道:

代码语言:javascript
复制
import UIKit
import RealityKit

class ViewController: UIViewController {        
    @IBOutlet var arView: ARView!
    var timer: Timer? = nil
    var count: CGFloat = 0.0
    var translate: SIMD3<Float>? = nil
    var box = ModelEntity()
    
    override func viewDidLoad() {
        super.viewDidLoad()            
        timer = Timer.scheduledTimer(timeInterval: 0.05,
                                           target: self,
                                         selector: #selector(updateSmoothly),
                                         userInfo: nil,
                                          repeats: true)
        
        self.box = ModelEntity(mesh: .generateBox(size: 0.4))
        let anchor = AnchorEntity(.camera)
        anchor.position.z = -0.5
        anchor.addChild(box)
        self.box.position.z = -1.0
        arView.scene.anchors.append(anchor)
    }        
    @objc func updateSmoothly() {
        self.count += 0.05                     
        let h = Float(sin(count))
        let v = Float(cos(count))
        self.translate = [h, v, 0] + [h, 0, v]  // orbiting around Z + Y axis
        box.position = self.translate!
    }
}

这是一个围绕Z轴的立方体。

代码语言:javascript
复制
self.translate = [h, v, 0]

提示:

您可以很容易地在实际编写器中应用轨道行为。

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

https://stackoverflow.com/questions/73013224

复制
相关文章

相似问题

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