将值从SwiftUI动态传递给ARKit
我目前正在使用ARKit和Swift进行个人项目。 在这个应用程序中,检测到的身体会显示骨架,并跟踪身体的运动 我想知道的是,如何通过动态触摸滑块来改变骨架的位置 骨架的位置是在ARKit类ARDelegateHandler中定义的,例如self.characterOffset=[1,0,0],这意味着距离检测到的身体1米。 我想通过SwiftUI中的滑块更改characterOffset的x轴值。(类似于self.characterOffset=[x,0,0]) 这是我的密码。 ARViewContainer.swift将值从SwiftUI动态传递给ARKit,swift,swiftui,augmented-reality,arkit,realitykit,Swift,Swiftui,Augmented Reality,Arkit,Realitykit,我目前正在使用ARKit和Swift进行个人项目。 在这个应用程序中,检测到的身体会显示骨架,并跟踪身体的运动 我想知道的是,如何通过动态触摸滑块来改变骨架的位置 骨架的位置是在ARKit类ARDelegateHandler中定义的,例如self.characterOffset=[1,0,0],这意味着距离检测到的身体1米。 我想通过SwiftUI中的滑块更改characterOffset的x轴值。(类似于self.characterOffset=[x,0,0]) 这是我的密码。 ARViewC
import SwiftUI
import RealityKit
import ARKit
import Combine
struct ARViewContainer: UIViewRepresentable {
let characterAnchor = AnchorEntity()
@Binding var offsetValue:Float
@ObservedObject var offsetInstance = Offset()
func makeUIView(context: Context) -> ARView {
let arView = ARView(frame: .zero)
arView.session.delegate = context.coordinator
return arView
}
func updateUIView(_ uiView: ARView, context: Context) {
let configuration = ARBodyTrackingConfiguration()
uiView.session.run(configuration)
uiView.scene.addAnchor(characterAnchor)
print(offsetValue)
}
func makeCoordinator() -> ARDelegateHandler {
ARDelegateHandler(self, anchor: characterAnchor)
}
class ARDelegateHandler: NSObject, ARSessionDelegate {
var arVC: ARViewContainer
let characterAnchor: AnchorEntity
var character: BodyTrackedEntity?
var characterOffset: SIMD3<Float>
init(_ control: ARViewContainer, anchor: AnchorEntity) {
self.arVC = control
self.characterAnchor = anchor
self.characterOffset = [1, 0, 0]
super.init()
setSkeleton()
}
func setSkeleton(){
var cancellable: AnyCancellable? = nil
cancellable = Entity.loadBodyTrackedAsync(named: "character/robot").sink(
receiveCompletion: { completion in
if case let .failure(error) = completion {
print("Error: Unable to load model: \(error.localizedDescription)")
}
cancellable?.cancel()
}, receiveValue: { (character: Entity) in
if let character = character as? BodyTrackedEntity {
character.scale = [1, 1, 1]
self.character = character
cancellable?.cancel()
} else {
print("Error: Unable to load model as BodyTrackedEntity")
}
})
}
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
for anchor in anchors {
guard let bodyAnchor = anchor as? ARBodyAnchor else { continue }
let bodyPosition = simd_make_float3(bodyAnchor.transform.columns.3)
characterAnchor.position = bodyPosition + characterOffset
characterAnchor.orientation = Transform(matrix: bodyAnchor.transform).rotation
if let character = character, character.parent == nil {
characterAnchor.addChild(character)
}
}
}
}
}
非常感谢你的帮助 是否根据
updateUIView
功能将正确的偏移值打印到控制台?如果是这样,您似乎从未在ARDelegateHandler
中使用offsetValue
变量。在didUpdateNodes
函数中,我认为您需要用相关的offsetValue
替换characterOffset
。
import SwiftUI
import RealityKit
import ARKit
import Combine
struct ContentView : View {
@State var offsetValue:Float = 0.0
@ObservedObject var offsetInstance = Offset()
var body: some View {
VStack{
Button(action:{self.offsetInstance.setOffset(offset: 1.0)},
label:{Text("check")})
ZStack(alignment: .bottom) {
ARViewContainer(offsetValue: $offsetValue)
SlideView(offSetValue: $offsetValue)
}
}
}
}