日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

苹果手机运行python_iPhone是卖的最好的手机?用Python照样把他玩弄鼓掌之间!

發(fā)布時(shí)間:2023/12/4 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 苹果手机运行python_iPhone是卖的最好的手机?用Python照样把他玩弄鼓掌之间! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)于 iOS 的技術(shù)解讀有很多,但是卻鮮有設(shè)備可視化同步的介紹文章。本文一起了解下這個(gè)酷炫的 iOS 黑科技。

我們的任務(wù)很簡單——如上圖所示,實(shí)時(shí)獲取設(shè)備的當(dāng)前方向。

UIDevice.current.orientation

首先,需要調(diào)用

beginGeneratingDeviceOrientationNotifications()

但僅僅這樣還不行。因?yàn)槿绻O(shè)備上的旋轉(zhuǎn)被鎖定了,那么就不會產(chǎn)生以上通知。我的相機(jī)應(yīng)用程序從頭到尾都需要知道方向——所以我意識到我需要直接根據(jù)設(shè)備的加速度計(jì)算方向。

好了,現(xiàn)在有了這些值,我們該做些什么呢?這是一個(gè)較難的部分。如果將所有內(nèi)容都輸出到控制臺,那么我們很快就會被大量數(shù)據(jù)淹沒。我認(rèn)為還是在屏幕上顯示這些值比較好。

但是,等等,如果將數(shù)值顯示在圖表上,會怎么樣?別想圖表了,我們可以來用開源的 Blender 試試,它可以實(shí)現(xiàn)這些值的可視化,并且很容易擴(kuò)展。

然而 Blender 并不是很好的代碼編輯器,所以我們還是使用鐘愛的外部編輯器吧。為了調(diào)用外部文件,我們可以將 print("hi") 替換成以下代碼:

import bpy

import os

filename = os.path.join(os.path.dirname(bpy.data.filepath), "server.py")

exec(compile(open(filename).read(), filename, ‘exec‘))

下一步,我們需要在與 .blend 文件相同的文件夾中創(chuàng)建新的 server.py 文件,我們真正的代碼就要保存在這里。現(xiàn)在我們可以用任何編輯器打開它,你可以選擇 Atom、Sublime,甚至 Word 2007 都行。

找到該 Cube 對象,點(diǎn)擊右鍵并選擇重命名,重命名為 iPhone。現(xiàn)在讓我們再來看一看 server.py。

import socket

import select

import json

import threading

import traceback

class ServerThread(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

self.running = True

def stopServer(self):

self.running = False

self.server.running = False

def run(self):

try:

self.server = Server()

while self.running:

self.server.receive()

except:

pass

class Server:

def __init__(self):

self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

self.socket.setblocking(False)

self.socket.bind((str(socket.INADDR_ANY), 9845))

self.socket.listen(2)

self.running = True

def __exit__(self, exc_type, exc_value, traceback):

self.socket.close()

def receive(self):

pairs = []

timeout = 1

while self.running:

sockets = list(map(lambda x: x[0], pairs))

if len(pairs) > 0:

read_sockets, write_sockets, error_sockets = select.select(sockets, [], [], timeout)

for sock in read_sockets:

data = sock.recv(4096)

if not data :

print(‘Client disconnected‘)

pairs = []

else :

self.connectionReceivedData(connection, data.decode())

try:

try:

connection,address = self.socket.accept()

print("new connection: ", connection)

pairs.append((connection, address))

except:

pass

except:

pass

for pair in pairs:

(connection, address) = pair

connection.close()

def connectionReceivedData(self, connection, data):

try:

motionData = json.loads(data)

except json.decoder.JSONDecodeError:

print("Invalid JSON: ", data)

return None

receivedMotionData(motionData)

# This is a global so when we run the script again, we can keep the server alive

# but change how it works

import bpy

def receivedMotionData(motionData):

phone = bpy.context.scene.objects["iPhone"]

phone.rotation_quaternion.x = float(motionData[‘x‘])

phone.rotation_quaternion.y = 0 - float(motionData[‘z‘])

phone.rotation_quaternion.z = float(motionData[‘y‘])

phone.rotation_quaternion.w = float(motionData[‘w‘])

pass

try:

if serverThread.running == False:

serverThread = ServerThread()

serverThread.start()

print("Starting server")

else:

print("Server already running, using new motion handler.")

except:

serverThread = ServerThread()

serverThread.start()

print("Starting server")

檢查 Blender,你應(yīng)該看到 iPhone 根本沒有改變。這是因?yàn)樯厦娴哪_本使用四元組設(shè)置了 iPhone 的旋轉(zhuǎn)角度,并且它使用了歐拉角進(jìn)行旋轉(zhuǎn)。需要做一些修改。將 Python 控制臺面切換到 “Properties”,然后單擊該面板頂部的橙色立方體圖標(biāo)。中部 Transform 的下面,點(diǎn)擊 XYZ Euler 并選擇 Quaternion。現(xiàn)在嘗試再次運(yùn)行 client.py。

你應(yīng)該看到 iPhone 立即翻轉(zhuǎn)過來了。不要驚慌,這就是我們想要的。現(xiàn)在,我們需要讓這個(gè)模型跟著實(shí)際的 iPhone 旋轉(zhuǎn)。

我們需要將運(yùn)動數(shù)據(jù)從 iPhone 發(fā)送到運(yùn)行 Blender 的計(jì)算機(jī)。感謝上蒼我們不需要深入到 Swift 中的原始 C 套接字級別,因?yàn)?Foundation 具有抽象。

我們可以將以下代碼放入新的 iOS 項(xiàng)目中,以替換默認(rèn)的 ViewController。請確保使用計(jì)算機(jī)的本地 IP 地址替換 host 變量。

import UIKit

import CoreMotion

class 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 Model

private struct MotionData: Codable {

var x: Double = 0

var y: Double = 0

var z: Double = 0

var w: Double = 0

}

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

歡迎關(guān)注我的博客或者公眾號:https://home.cnblogs.com/u/Python1234/ Python學(xué)習(xí)交流

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的苹果手机运行python_iPhone是卖的最好的手机?用Python照样把他玩弄鼓掌之间!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品国产三级国产传播 | www国产无套内射com | 一级黄色片a| 久久激情视频 | 欧美一级日韩一级 | 成人黄色网址在线观看 | 亚洲AV无码成人精品区先锋 | 亚洲综合免费观看高清完整版 | 国产黄色免费网站 | 五月天久久 | 精品国产一二三四区 | 久久久久久av无码免费网站下载 | 亚洲精品日日夜夜 | xvideos永久免费入口 | 夜夜躁很很躁日日躁麻豆 | 日本中文字幕精品 | 97成网| 911看片| 6699嫩草久久久精品影院 | 男人天堂网在线 | 人妻互换免费中文字幕 | 体感预报日剧 | 一级黄在线观看 | 九九小视频 | 操日本女人 | 亚洲第三区| 欧美日韩精品久久 | 九一精品国产 | 黄色一级毛片 | 国精产品一区一区三区mba下载 | 日韩亚洲天堂 | 黄色一区二区三区四区 | 男女视频在线观看免费 | 成人动漫免费观看 | av网站在线免费 | 欧美一级爆毛片 | 91www| 午夜手机福利 | www.操com| 亚洲婷婷久久综合 | 有机z中国电影免费观看 | 国产亚洲久一区二区 | 91丝袜视频 | 欧美人人爽| 美女av网站 | 欧美成人看片黄a免费看 | 日韩免费视频一区二区视频在线观看 | 亚洲free性xxxx护士白浆 | 国产综合精品久久久久成人影 | 国产小视频免费观看 | 久久国产精品亚洲 | 性欧美18| 亚洲欧美日韩精品 | 国产精品电影 | 午夜影院在线观看视频 | 欧美成人怡红院 | 日韩精品视频网站 | 国内激情 | 99视频在线观看视频 | 一级a毛片免费观看久久精品 | www.日本免费 | 日日噜噜噜噜人人爽亚洲精品 | 日色视频 | av线上免费观看 | 伊人久久一区二区三区 | 日韩欧美麻豆 | 一级在线| 欧美 亚洲| 精品视频一区二区三区四区 | 亚洲av首页在线 | 精品3p| 野花社区视频在线观看 | 三级a毛片| av之家在线 | 欧美精品手机在线 | 奇米影视在线播放 | 国产亚洲电影 | 在线观看视频亚洲 | av色图片 | 人人人人干 | 91免费国产在线观看 | www中文字幕在线观看 | 国产欧美一区二区三区鸳鸯浴 | 欧美成年人在线观看 | 大尺度av | 想要视频在线观看 | 男人的天堂视频 | 国产精品久久久国产盗摄 | 免费黄网站在线观看 | 亚洲区国产区 | 成人高清网站 | 欧美大肚乱孕交hd孕妇 | 久久福利免费视频 | 亚洲一区在线播放 | 日本一本久久 | 红猫大本营在线观看的 | 国产aaa大片| 按摩害羞主妇中文字幕 | 青青青av |