iPhone是賣的最好的手機?用Python照樣把他玩弄鼓掌之間!

iPhone是賣的最好的手機?用Python照樣把他玩弄鼓掌之間!

檢查 Blender,你應該看到 iPhone 根本沒有改變。這是因為上面的腳本使用四元組設置了 iPhone 的旋轉角度,並且它使用了歐拉角進行旋轉。需要做一些修改。將 Python 控制檯面切換到 “Properties”,然後單擊該面板頂部的橙色立方體圖標。中部 Transform 的下面,點擊 XYZ Euler 並選擇 Quaternion。現在嘗試再次運行 client.py。

你應該看到 iPhone 立即翻轉過來了。不要驚慌,這就是我們想要的。現在,我們需要讓這個模型跟著實際的 iPhone 旋轉。

iPhone是賣的最好的手機?用Python照樣把他玩弄鼓掌之間!

我們需要將運動數據從 iPhone 發送到運行 Blender 的計算機。感謝上蒼我們不需要深入到 Swift 中的原始 C 套接字級別,因為 Foundation 具有抽象。

我們可以將以下代碼放入新的 iOS 項目中,以替換默認的 ViewController。請確保使用計算機的本地 IP 地址替換 host 變量。

import UIKitimport CoreMotionclass CoreMotionViewController: UIViewController, StreamDelegate { let motionManager = CMMotionManager() let queue = OperationQueue() let host = "192.168.1.2" override func viewDidLoad() { super.viewDidLoad() setUpStreams(host: host) motionManager.startDeviceMotionUpdates(to: queue) { (data: CMDeviceMotion?, error: Error?) in guard let data = data else { print("Error: \(error!)") return } let attitude: CMAttitude = data.attitude let quaternion = attitude.quaternion var motionData = MotionData() motionData.x = quaternion.x motionData.y = quaternion.y motionData.z = quaternion.z motionData.w = quaternion.w let encoder = JSONEncoder() do { let json = try encoder.encode(motionData) self.send(data: json) } catch let error { print("Couldn't send data, error: \(error)") } } } // MARK: - Streams var inputStream: InputStream? var outputStream: OutputStream? func setUpStreams(host: String) { var readStream: Unmanaged? var writeStream: Unmanaged? CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host as CFString, 9845, &readStream, &writeStream) inputStream = readStream!.takeRetainedValue() outputStream = writeStream!.takeRetainedValue() guard let inputStream = inputStream, let outputStream = outputStream else { print("Failed to create streams") return } inputStream.delegate = self outputStream.delegate = self inputStream.schedule(in: .current, forMode: .commonModes) outputStream.schedule(in: .current, forMode: .commonModes) inputStream.open() outputStream.open() } func send(data: Data) { guard let outputStream = outputStream else { return } _ = data.withUnsafeBytes { outputStream.write($0, maxLength: data.count) } } func stream(_ aStream: Stream, handle eventCode: Stream.Event) { if eventCode == .errorOccurred { inputStream = nil outputStream = nil print("Error: Stream error") } else if eventCode == .endEncountered { inputStream = nil outputStream = nil print("Error: Encountered end of stream") } let maxReadLength = 4096 if eventCode == .hasBytesAvailable { guard let inputStream = inputStream else { return } while inputStream.hasBytesAvailable { let buffer = UnsafeMutablePointer.allocate(capacity: maxReadLength) inputStream.read(buffer, maxLength: maxReadLength) buffer.deallocate() } } }}// MARK: - Data Modelprivate struct MotionData: Codable { var x: Double = 0 var y: Double = 0 var z: Double = 0 var w: Double = 0}
iPhone是賣的最好的手機?用Python照樣把他玩弄鼓掌之間!

iPhone是賣的最好的手機?用Python照樣把他玩弄鼓掌之間!

那麼最終我是如何從移動管理器獲取方向信息的?


分享到:


相關文章: