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

RealityKit中如何放置与定向虚拟相机?

在RealityKit中实现虚拟相机跟随玩家的正确方法

核心问题:未设置相机为活跃虚拟相机

当你将RealityViewCameraContent.camera设为.virtual时,RealityKit默认会使用一个位于世界原点的默认虚拟相机。你之前的尝试失败,大概率是因为没有将自己创建的相机标记为“主要相机”,导致系统仍在使用默认相机。


正确实现相机跟随的两种方法

方法1:直接给玩家实体添加相机组件

将PerspectiveCameraComponent直接附加到玩家实体上,并设置isPrimary: true,这样玩家移动时相机会自动跟随:

// 创建玩家实体
let playerEntity = Entity()
playerEntity.name = "Player"

// 创建相机组件,标记为主要活跃相机
let cameraComponent = PerspectiveCameraComponent(
    fieldOfViewInDegrees: 60,
    isPrimary: true
)
playerEntity.components.set(cameraComponent)

// 设置玩家初始位置(你的目标位置)
playerEntity.position = SIMD3<Float>(84.0, 0, 56.0)

// 将玩家添加到场景
content.add(playerEntity)

// 后续移动玩家时,相机自动跟随
playerEntity.position = SIMD3<Float>(newX, newY, newZ)

方法2:将相机作为玩家的子节点

如果需要相机相对于玩家有固定偏移(比如在玩家前方),可以把相机实体作为玩家的子节点:

let playerEntity = Entity()
playerEntity.name = "Player"
playerEntity.position = SIMD3<Float>(84.0, 0, 56.0)

// 创建相机实体
let cameraEntity = Entity()
let cameraComponent = PerspectiveCameraComponent(
    fieldOfViewInDegrees: 60,
    isPrimary: true
)
cameraEntity.components.set(cameraComponent)

// 设置相机相对于玩家的偏移(比如在玩家Z轴正方向1米处)
cameraEntity.position = SIMD3<Float>(0, 0, 1.0)

// 将相机添加为玩家子节点
playerEntity.addChild(cameraEntity)
content.add(playerEntity)

替代SceneKit的SCNLookAtConstraint:手动控制相机朝向

RealityKit没有直接对应的LookAt约束,但可以在RealityView的update回调中手动更新相机朝向,实现始终看向某个目标:

struct YourRealityView: View {
    var body: some View {
        RealityView { content in
            // 在这里添加玩家和相机实体(参考上面的方法)
        } update: { content in
            // 获取玩家和相机实体
            guard let player = content.entities.first(where: { $0.name == "Player" }),
                  let camera = content.entities.first(where: { $0.components.has(PerspectiveCameraComponent.self) }) else {
                return
            }
            
            // 让相机始终看向玩家前方10米的点(Z轴正方向)
            let targetPosition = player.position + SIMD3<Float>(0, 0, 10)
            camera.transform = Transform.look(
                at: targetPosition,
                from: camera.position,
                relativeTo: player
            )
        }
    }
}

你之前尝试失败的原因解析

  1. 方法1/2未设置isPrimary: true:系统仍使用默认的原点相机,所以看不到玩家移动带来的视角变化。
  2. 模板代码未标记主要相机:创建的相机没有成为活跃相机,默认相机仍在原点。
  3. AnchorEntity方法视角反向:未设置isPrimary导致默认相机生效,加上look(at:)使用世界坐标系(relativeTo: nil),最终视角不符合预期。

内容的提问来源于stack exchange,提问作者PKCLsoft

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:13:15