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

RealityKit中自定义CollisionShape位置偏移问题求助

问题:自定义CollisionShape与Reality Composer加载的Entity位置偏移

从Reality Composer加载Entity并添加自定义CollisionShape后,出现碰撞形状与实体内容位置偏移的问题(碰撞形状位于实体下方,或实体内容位于碰撞形状上方)。推测RealityKit将Entity添加到表面时会调整内容位置使其贴合平面,需要解决两者位置对齐的问题。


解决方案

问题核心是Reality Composer导出的Entity原点与生成的CollisionShape原点不匹配,加上边界计算的坐标系基准错误,导致偏移。以下是具体修正步骤:

1. 修正边界计算的坐标系基准

当前代码中visualBounds使用relativeTo: self(上下文实体坐标系),会导致边界计算基于外部坐标系而非模型自身。改为基于rocketScene自身坐标系,才能准确获取模型真实边界:

let visualBounds = rocketScene.visualBounds(
    recursive: true, 
    relativeTo: rocketScene,  // 改为相对于模型自身
    excludeInactive: false
)

2. 为CollisionShape添加视觉中心偏移

默认生成的Capsule形状原点与模型视觉中心不重合,需将形状偏移到模型视觉中心位置:

// 获取模型视觉边界中心相对于自身原点的偏移量
let centerOffset = visualBounds.center
// 生成形状并应用偏移
let shapeResource = ShapeResource.generateCapsule(
    height: visualBounds.extents.y, 
    radius: visualBounds.boundingRadius / 2
).offsetBy(translation: centerOffset)

3. 完整修正代码

// 获取.reality文件路径并加载模型
let rocketSceneUrl = Bundle.main.url(forResource: "Experience", 
                                   withExtension: "reality")!
                                        .appending(path: "RocketScene", 
                                          directoryHint: .notDirectory)

let rocketScene = try Entity.load(contentsOf: rocketSceneUrl)

// 获取模型自身的视觉边界
let visualBounds = rocketScene.visualBounds(
                                  recursive: true, 
                                 relativeTo: rocketScene, 
                            excludeInactive: false)

// 计算视觉中心偏移
let centerOffset = visualBounds.center

// 生成带偏移的碰撞形状
let shapeResource = ShapeResource.generateCapsule(
                                    height: visualBounds.extents.y, 
                                    radius: visualBounds.boundingRadius / 2
).offsetBy(translation: centerOffset)

// 创建并设置碰撞组件
let collision = CollisionComponent(
                            shapes: [shapeResource], 
                              mode: .trigger, 
                            filter: .sensor)
rocketScene.components.set(collision)

// 添加到AR场景
arView.scene.addAnchor(rocketScene)

4. 额外验证:Reality Composer中的原点设置

打开Reality Composer中的Experience.reality文件,选中RocketScene的根实体,检查Transform面板的原点位置。如果模型视觉中心与实体原点偏差较大,可在Reality Composer中调整原点到模型中心,减少代码中的偏移计算量。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:22:51