使用 iOS 18 RealityView 非常方便地替换 SceneKit 创建 3d 但当涉及到使用 2d 触摸和拖动来移动 3d 实体时,我面临一个问题,我无法做出准确的移动,就像将 3d 实体附加到我的手指上并拖动它一样在屏幕上,在 SceneKit 中使用项目和取消项目要容易得多,而且在 ARKit/ARView 中使用光线投射,它在 VisionOS 中也非常成功,因为它是 3D Touch,我可以在手势值中使用 3D 位置,但在 2D 中它根本不起作用
这是我最接近的,它确实移动了 3d 实体,但是 对手指位置反应不佳。
import SwiftUI
import RealityKit
struct ContentView: View {
@State var box = Entity()
@State var lastPanTouchPosition: CGPoint = .zero
var body: some View {
RealityView{ content in
let item = ModelEntity(mesh: .generateBox(size: .init(0.25, 0.25, 0.25)), materials: [SimpleMaterial(color: .blue, isMetallic: true)])
box.addChild(item)
content.add(box)
}
.gesture(dragThis)
}
var dragThis: some Gesture {
DragGesture()
.onChanged { value in
print(value.translation)
print(value.location)
let dragRatio: Float = 0.0001
box.position.x += Float(value.translation.width) * dragRatio
box.position.y -= Float(value.translation.height) * dragRatio
}
.onEnded{_ in
box.position = [0, 0, 0]
}
}
}
使用标准 2D 手势在
iOS RealityView
的 3D 空间中移动 AR/VR 模型的美妙之处在于,您无需打开 CollisionComponent
,这意味着重型模型的响应速度要快得多。缺点也很明显:你需要在屏幕上移动手指的速度和模型移动的速度之间找到平衡,模型的移动速度可能位于沿着 Z 轴距相机相当远的距离。此代码运行良好(在 12.9" iPad 上测试):
import SwiftUI
import RealityKit
struct ContentView : View {
@State var position: UnitPoint = .zero
let box = ModelEntity(mesh: .generateBox(size: 0.25))
let ratio: Float = 0.002
let group = Entity()
var drag: some Gesture {
DragGesture(minimumDistance: 15, coordinateSpace: .global)
.onChanged {
group.position.x = Float($0.translation.width + position.x) * ratio
group.position.y = Float($0.translation.height + position.y) * -ratio
}
.onEnded {
position.x += $0.translation.width
position.y += $0.translation.height
}
}
var body: some View {
RealityView { rvc in
group.addChild(box)
rvc.add(group)
}
.gesture(drag)
}
}