SceneKit – Orientation is not updating when using @Environment(\.presentationMode)

Viewed 48

I have a SwiftUI view that contains a SCNSceneView that contains a 3d model. I am setting quaternions to different nodes in the 3d model using simdWorldOrientation every 10 milliseconds.

The model changes and things work well until I add @Environment(\.presentationMode) var dismiss to the same swift ui view, then the quaternions dont seem to be changing the model.

SwiftUI View:


    @Environment(\.presentationMode) var dismiss: Binding<PresentationMode>
    @State var startSimulation = false
    @State var currentQuaternionStrings = [String]()
    @State var startSim = false
    
    @State var allTransformsData = [CapturedData]()
    
    var numberOfFiles = 25
    
    @State var currentFileLength: Int = 0
    @State var currentIndexInFile: Int = 700
    
    var timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
    
    
    init() {
        
        _allTransformsData = State(initialValue: createData())
        _currentFileLength = State(initialValue: allTransformsData.count)
        
    }
  
    var body: some View {
        
        VStack{
            Divider()
            TPoseView(quaternionStrings: $currentQuaternionStrings)
                .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height * 0.5)
                
            
            Divider()
            
            
            Button{
                startSim.toggle()
            } label: {
                Text("Start")
            }
            .padding()
            
                
        }
        .onReceive(timer) { _ in

            if startSim && currentIndexInFile < currentFileLength {
                
                currentQuaternionStrings = allTransformsData[currentIndexInFile].quaternionStrings
                currentIndexInFile += 1
            }
        }
    }
    
    func createData() -> [CapturedData] {
        
        let arr = [file1, file2, file3, file4, file5, 
                   file6, file7, file8, file9, file10, 
                   file11, file12, file13, file14, file15, 
                   file16, file17, file18, file19, file20, 
                   file21, file22, file23, file24, file25]
                
        var allTransformsData = [CapturedData]()
        
        for file in arr {
            let data: Data? = file.data(using: .utf8)
            //let json = (try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)) as? [Dictionary<String,Any>]
            let decoder = JSONDecoder()
            if let decodedData = try? decoder.decode([CapturedData].self, from: data!) {
                
                allTransformsData.append(contentsOf: decodedData)
            }
        }
        return allTransformsData
    }

Note: file1, file2, file3, ... are json strings containing the quaternions.

Link to the quaternions being applied successfully- https://imgur.com/GLHThgK

UI View Representable of the Scene Kit View:

struct TPoseView: UIViewRepresentable {
    
    typealias UIViewType = UIView
    
    let sceneView = SCNView()
    let scene = SCNScene(named: "TPoseMain.usdz")
    
    @Binding var quaternionStrings: [String]
    
    
    func makeUIView(context: Context) -> UIView {
        
        
        sceneView.scene = scene
        sceneView.allowsCameraControl = true
        sceneView.autoenablesDefaultLighting = true
        
        return sceneView
    }
    
    
    func updateUIView(_ uiView: UIView, context: Context) {
        
        
        let skeleton = scene?.rootNode.childNode(
            withName: "TPoseMain", recursively: true)
        
        
        let leftHandLower = skeleton?.childNode(withName: "mixamorig_LeftForeArm", recursively: true)
        
        let leftHandUpper = skeleton?.childNode(withName: "mixamorig_LeftArm", recursively: true)
        
        let rightHandLower = skeleton?.childNode(withName: "mixamorig_RightForeArm", recursively: true)
        
        let rightHandUpper = skeleton?.childNode(withName: "mixamorig_RightArm", recursively: true)
        
        let waist = skeleton?.childNode(withName: "mixamorig_Hips", recursively: true)
        
        let leftLegLower = skeleton?.childNode(withName: "mixamorig_LeftLeg", recursively: true)
        
        let leftLegUpper = skeleton?.childNode(withName: "mixamorig_LeftUpLeg", recursively: true)
        
        let rightLegLower = skeleton?.childNode(withName: "mixamorig_RightLeg", recursively: true)
        
        let rightLegUpper = skeleton?.childNode(withName: "mixamorig_RightUpLeg", recursively: true)
        
        let chest = skeleton?.childNode(withName: "mixamorig_Spine1", recursively: true)
        
        let leftFoot = skeleton?.childNode(withName: "mixamorig_LeftFoot", recursively: true)
        
        let rightFoot = skeleton?.childNode(withName: "mixamorig_RightFoot", recursively: true)
        
        
        
        var i = 1
        
        print(quaternionStrings)
        
        //for setting values to different nodes in the model
        
        for transformInstance in quaternionStrings {
            let quaternionStringsList = transformInstance.components(separatedBy: ",")
            
            if i == 1 {
                
                leftHandLower?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 2 {
                leftHandUpper?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 3 {
                rightHandLower?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 4 {
                rightHandUpper?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 5 {
                waist?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 6 {
                leftLegLower?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 7 {
                leftLegUpper?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 8 {
                rightLegLower?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 9 {
                rightLegUpper?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 10 {
                chest?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 11 {
                leftFoot?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            if i == 12 {
                rightFoot?.simdWorldOrientation = simd_quatf(vector: simd_float4(
                    -Float(quaternionStringsList[0])!, Float(quaternionStringsList[1])!, Float(quaternionStringsList[2])!, -Float(quaternionStringsList[3])!
                ))
            }
            
            i += 1
        }
        
    }
    
}
0 Answers
Related