将值从SwiftUI动态传递给ARKit

将值从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

我目前正在使用ARKit和Swift进行个人项目。 在这个应用程序中,检测到的身体会显示骨架,并跟踪身体的运动

我想知道的是,如何通过动态触摸滑块来改变骨架的位置

骨架的位置是在ARKit类ARDelegateHandler中定义的,例如self.characterOffset=[1,0,0],这意味着距离检测到的身体1米。 我想通过SwiftUI中的滑块更改characterOffset的x轴值。(类似于self.characterOffset=[x,0,0])

这是我的密码。 ARViewContainer.swift

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)
            }
        }

    }
}