RealityView iOS 18 如何使用触摸拖动手势精确移动实体

问题描述 投票:0回答:1

使用 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]
        }
    }
}

enter image description here

ios scenekit realitykit arview realityview
1个回答
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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.