You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

visionOS沉浸式空间中无法设置自定义相机的问题求助

解决visionOS沉浸式空间自定义相机不生效的问题

你的代码存在两个核心问题,导致自定义相机未被系统启用:

1. 未禁用默认头部追踪相机

在沉浸式空间场景中,RealityView默认使用头部追踪的系统相机,必须显式声明使用自定义相机。需要给RealityView添加cameraMode: .explicit参数,同时指定content.camera = cameraEntity,明确告诉系统启用我们创建的相机实体。

2. 相机定位逻辑可优化

look(at:from:relativeTo:)方法的坐标系逻辑容易产生预期外的结果,直接设置相机的transform.position再调用look(at:)调整朝向,逻辑会更清晰直观。

修改后的完整代码:

struct ImmersiveView: View {
    @Environment(AppModel.self) var appModel

    var body: some View {
        // 显式指定使用自定义相机,禁用默认头部追踪相机
        RealityView(cameraMode: .explicit) { content in
            let cameraEntity = makeCamera()
            content.add(cameraEntity)
            // 设置当前活跃相机为自定义相机
            content.camera = cameraEntity

            let boxEntity = makeBox()
            content.add(boxEntity)
        }
    }
    
    func makeCamera() -> Entity {
        let cameraEntity = Entity()
        
        // 直接设置相机位置在z轴2米处
        cameraEntity.transform.position = SIMD3<Float>(0, 0, 2)
        // 让相机朝向(1,1,1)点
        cameraEntity.look(at: SIMD3<Float>(1,1,1), relativeTo: nil)
        
        cameraEntity.components.set(PerspectiveCameraComponent())
        
        return cameraEntity
    }
    
    func makeBox() -> ModelEntity {
        let size: Float = 0.3
        let mesh = MeshResource.generateBox(width: size, height: size, depth: size)
        var material = UnlitMaterial(); material.color.tint = .red
        let boxEntity = ModelEntity(mesh: mesh, materials: [material])
        boxEntity.transform.translation = [0, 0, -3]
        return boxEntity
    }
}

额外提示

  • 设置cameraMode: .explicit后,系统会停止头部追踪,相机位置完全由代码控制。如果需要结合头部追踪功能,可以将自定义相机作为用户头部实体的子节点。
  • 当前盒子位于z=-3位置,而相机在z=2且朝向(1,1,1),盒子可能不在相机视野内。可以临时将盒子位置改为[1,1,1],快速验证自定义相机是否正常工作。

内容的提问来源于stack exchange,提问作者Reinhard Männer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:57:06