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