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照样把他玩弄鼓掌之间!

那么最终我是如何从移动管理器获取方向信息的?


分享到:


相關文章: