如何在 ARView 中使用 setWorldOrigin?

发布于 2025-01-12 17:10:48 字数 653 浏览 0 评论 0原文

在下面的 RealityKit 代码中,考虑到我应用于 y 的世界平移,我希望该框的位置较低。我想我误解了 setWorldOrigin 的作用。我想重新定义坐标映射,以便零位于不同的位置。我做错了什么/期待错了什么?谢谢。

let arView = ARView(frame: .zero, cameraMode: .nonAR)
arView.environment.background = .color(.white)

var relativeTransform = matrix_identity_float4x4
relativeTransform.columns.3.y = -1
arView.session.setWorldOrigin(relativeTransform: relativeTransform)
        
let material = SimpleMaterial(color: .gray, isMetallic: false)
let entity = ModelEntity(mesh: .generateBox(size: 0.3), materials: [material])
        
let anchor = AnchorEntity(world: .zero)
anchor.addChild(entity)
arView.scene.addAnchor(anchor)

In the RealityKit code below I expect the box to be positioned lower given the world translation I've applied to y. I think I'm misunderstanding what setWorldOrigin does. I want to redefine the coordinate mapping so that zero is in a different location. What am I doing/expecting incorrectly? Thanks.

let arView = ARView(frame: .zero, cameraMode: .nonAR)
arView.environment.background = .color(.white)

var relativeTransform = matrix_identity_float4x4
relativeTransform.columns.3.y = -1
arView.session.setWorldOrigin(relativeTransform: relativeTransform)
        
let material = SimpleMaterial(color: .gray, isMetallic: false)
let entity = ModelEntity(mesh: .generateBox(size: 0.3), materials: [material])
        
let anchor = AnchorEntity(world: .zero)
anchor.addChild(entity)
arView.scene.addAnchor(anchor)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泪冰清 2025-01-19 17:10:48

AR 解决方案

阅读这篇文章了解详细信息。


非AR解决方案

ARSession是一个AR对象,因此所有session的属性和方法只有在session运行时才起作用。 ARSession 在 .nonAR 模式(即 VR 模式)、macOS 应用程序和 Xcode 模拟器中毫无意义。对于您的情况,我建议使用以下场景。

import UIKit
import RealityKit

class Camera: Entity, HasPerspectiveCamera, HasAnchoring {
    required init() {
        super.init()
   
        self.camera = PerspectiveCameraComponent(near: 0.01, 
                                                  far: 200.00, 
                                 fieldOfViewInDegrees: 50.0)
        self.transform.translation.y = 0.5
        self.transform.translation.z = 2.0
    }
}

class ViewController: UIViewController {
        
    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        arView.environment.background = .color(.black)
        let camera = Camera()
        arView.scene.addAnchor(camera)

        let entity = ModelEntity(mesh: .generateBox(size: 0.1))      
        let anchor = AnchorEntity(world: .zero)
        anchor.addChild(entity)
        arView.scene.addAnchor(anchor)
    }
}

PS

在使用 .ar 模式的 RealityKit 2.0 中,您无法更改 远裁剪平面 值。

AR solution

Read this post for details.


Non-AR solution

ARSession is an AR object, so all session's properties and methods are working only when session is running. ARSession is meaningless in .nonAR mode (i.e. VR mode), on macOS app, and in the Xcode Simulator. In your case, I suggest using the following scenario.

import UIKit
import RealityKit

class Camera: Entity, HasPerspectiveCamera, HasAnchoring {
    required init() {
        super.init()
   
        self.camera = PerspectiveCameraComponent(near: 0.01, 
                                                  far: 200.00, 
                                 fieldOfViewInDegrees: 50.0)
        self.transform.translation.y = 0.5
        self.transform.translation.z = 2.0
    }
}

class ViewController: UIViewController {
        
    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        arView.environment.background = .color(.black)
        let camera = Camera()
        arView.scene.addAnchor(camera)

        let entity = ModelEntity(mesh: .generateBox(size: 0.1))      
        let anchor = AnchorEntity(world: .zero)
        anchor.addChild(entity)
        arView.scene.addAnchor(anchor)
    }
}

P. S.

In RealityKit 2.0 using .ar mode, you can't change far clipping plane value.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文