Hallo. Ich bin Sato, der alltäglich ist. Ja, ich bin es. Vor kurzem habe ich mich plötzlich für AR interessiert. Ich möchte LIDAR berühren, habe aber kein Terminal mit LIDAR. .. Erfahren Sie zunächst, was Sie mit ARKit tun können! Ich dachte, zuerst habe ich angefangen zu studieren! Warum von Motion Capture ... Ist es einfacher einzutreten, wenn es Bewegung gibt? Ich denke, ich werde es versuchen!
ARKit Es gibt eine offizielle Erklärung von Apple, bitte überprüfen Sie hier ^^ Apple ARKit4
ARKit 4 führt eine brandneue Tiefen-API ein, die eine neue Möglichkeit bietet, auf detaillierte Tiefeninformationen zuzugreifen, die von LiDAR-Scannern auf iPhone 12 Pro, iPhone 12 Pro Max und iPad Pro gesammelt wurden. Location Anchors nutzt die hochauflösenden Daten von Apple Maps, um das AR-Erlebnis an bestimmten Orten in der Welt der iPhone- und iPad-Apps zu platzieren. Darüber hinaus wurde die Gesichtsverfolgungsunterstützung auf alle Geräte mit Apple Neural Engine und Frontkamera erweitert, sodass noch mehr Benutzer den Spaß an AR mit Fotos und Videos erleben können.
Zuerst wie gewohnt mit Xcode "Willkommen bei Xcode" Wählen Sie "Neues Xcode-Projekt erstellen"
Wählen Sie "Augmented Reality App"
「MotionCapture」 Erstellen Sie dieses Mal eine Beispiel-Motion-Capture-App wie diese, und klicken Sie auf "Weiter". Sie können das Projekt an einem beliebigen Ort speichern.
Xcode wurde gestartet und die Vorlagen-App wurde erstellt. Schließen Sie Ihr iPhone an Ihren Mac an und versuchen Sie "Ausführen". Wählen Sie "OK" für die Zugriffsberechtigung zur Kamera, bewegen Sie das iPhone und suchen Sie nach der Jet-Maschine! Wenn Sie es finden, können Sie die Düsenebene aus verschiedenen Winkeln überprüfen, indem Sie den Winkel ändern.
Du hast es lange erklärt ... Nur für den Fall, dass es Leute gibt, die es brauchen, also habe ich es w geschrieben
ARSCNViewDelegate ist bereits enthalten. ARSCVViewDelegate fügt ARnchor hinzu, aktualisiert, löscht usw. Es ist für die Behandlung des Ereignisses vorbereitet, Da ich die Bewegung dieses Mal erfassen möchte, verwende ich ARSessionDelegate. Ändern Sie "ARSCNViewDelegate" in "ARSessionDelegate".
ViewController.swift
class ViewController: UIViewController, ARSCNViewDelegate {
↓
class ViewController: UIViewController, ARSessionDelegate {
SceneView ist bereits in der Vorlage definiert. Natürlich ist es auch in StoryBoard verfügbar.
ViewController.swift
@IBOutlet var sceneView: ARSCNView!
Entfernen Sie den sceneView-Delegaten und Setzen Sie im Delegaten der Sitzung von sceneView auf self, damit es verarbeitet werden kann
ViewController.swift
sceneView.delegate = self
↓
sceneView.session.delegate = self
Setzen Sie eine leere SCNSScene auf die Szene der sceneView
ViewController.swift
sceneView.scene = SCNScene()
Dies ist diesmal nicht erforderlich, sodass Sie es löschen können
ViewController.swift
// Show statistics such as fps and timing information
//Die Standardeinstellung ist false, aber die Informationsanzeige am unteren Bildschirmrand, als sie im Düsenflugzeug ausgegeben wurde, ist aktiviert./aus Flagge
sceneView.showsStatistics = true
// Create a new scene
//Laden Sie ein Jet-3D-Objekt
let scene = SCNScene(named: "art.scnassets/ship.scn")!
// Set the scene to the view
//Zeigen Sie die Jet-Maschine in sceneView an
sceneView.scene = scene
Ursprünglich in viewWillAppear Ändern Sie "ARWorld Tracking-Konfiguration" in "AR Body Tracking-Konfiguration". Auf sceneView setzen.
ARWorldTrackingConfiguration ARBodyTrackingConfiguration
ViewController.swift
guard ARBodyTrackingConfiguration.isSupported else {
fatalError("This feature is only supported on devices with an A12 chip")
}
// Create a session configuration
// let configuration = ARWorldTrackingConfiguration()
// ↓
let configuration = ARWorldTrackingConfiguration()
// Run the view's session
sceneView.session.run(configuration)
Diese beiden werden diesmal verwendet
https://developer.apple.com/documentation/arkit/arsessiondelegate
func session(ARSession, didAdd: [ARAnchor])
func session(ARSession, didUpdate: [ARAnchor])
Überprüfen Sie für eine Ankerschleife, ob ARAnchor ARBodyAnchor ist, und verarbeiten Sie diesmal nur ARBodyAnchor Rückkehr.
ViewController.swift
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
for anchor in anchors {
guard let bodyAnchor = anchor as? ARBodyAnchor else {
return
}
// Next
}
}
Überprüfen Sie wie bei didAdd ARAnchor und implementieren Sie es so, dass nur das Ziel verarbeitet wird.
ViewController.swift
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
for anchor in anchors {
guard let bAnchor = anchor as? ARBodyAnchor else {
return
}
// Next
}
}
Verwenden wir ARBodyAnchor, das von beiden Delegatmethoden erhalten wurde, und zeigen es auf dem Bildschirm an. -Extrahieren Sie Skelett von ARBodyAnchor. Skelett ist physikalische 3D-Information.
ViewController.swift
let skeleton = anchor.skeleton
Holen Sie sich die gemeinsamen Namen der [AR SkeletonDefinition] des Skeletts (https://developer.apple.com/documentation/arkit/arskeletondefinition) in eine for-Schleife. Die Koordinaten von ARBodyAnchor sind auf die Position von "hips_joint" zentriert. Verwenden Sie den erhaltenen Gelenknamen und verwenden Sie modelTransform, um das Ausmaß der Bewegung und Drehung von der Mitte zu erhalten. Für modelTransform wird nil erhalten, wenn ein nicht vorhandener JointName festgelegt wird.
ViewController.swift
for jointName in skeleton.definition.jointNames {
let jointType = ARSkeleton.JointName(rawValue: jointName)
if let transform = skeleton.modelTransform(for: jointType) {
Anmerkungen: JointName
Multiplizieren Sie die erfassten Teileinformationen mit dem Mittelpunkt von ARBody Anchor Erfassen Sie die Position und Drehung von Teilen im 3D-Raum.
ViewController.swift
///Wirf die Position / Drehung von JointType
let partsPoint = SCNMatrix4(transform)
///Wirf die Position / Drehung des Referenzpunkts Hüfte
let hipPoint = SCNMatrix4(anchor.transform)
/// func SCNMatrix4Mult(_ a: SCNMatrix4, _ b: SCNMatrix4) ->Berücksichtigen Sie beim Synthetisieren einer Matrix mit SCNMatrix4, dass a links später und b rechts zuerst ausgeführt wird.
let matrix = SCNMatrix4Mult(partsPoint, hipPoint)
let position = SCNVector3(matrix.m41, matrix.m42, matrix.m43)
Suchen Sie in der Szenenansicht in Schlüssel und nach dem Knotennamen Wenn vorhanden, legen Sie die Position des Knotens fest und aktualisieren Sie ihn. Wenn es nicht existiert, erstellen Sie eine Kugel mit "SCNSphere (Radius: 0,02)". Erstellen Sie SCNNode, legen Sie Position und Namen für die Suche fest AddChildNode zum erstellten SCNNode zu sceneView.scene.rootNode.
ViewController.swift
if let nodeToUpdate = sceneView.scene.rootNode.childNode(withName: jointName, recursively: false) {
///Da es bereits hinzugefügt wurde, aktualisieren Sie nur die Position
nodeToUpdate.isHidden = false
nodeToUpdate.position = position
} else {
// GeoSphere
//Radius Der Radius der Kugel mit einem Anfangswert von 1.
let sphereGeometry = SCNSphere(radius: 0.02)
//Wenn diese Option aktiviert ist, wird die Oberfläche des dreieckigen Polygons gleichmäßig konstruiert. Der Anfangswert ist falsch
sphereGeometry.isGeodesic = true
//Kugelfarbe
sphereGeometry.firstMaterial?.diffuse.contents = UIColor.green
//Stellen Sie die Kugelgeometrie für den Knoten ein
let sphereNode = SCNNode(geometry: sphereGeometry)
//Positionseinstellung anzeigen
sphereNode.position = position
//Namenseinstellung für Knoten
sphereNode.name = jointName
//Zum Stammknoten hinzufügen
sceneView.scene.rootNode.addChildNode(sphereNode)
}
Lass es uns laufen. Wenn keine Personen anwesend sind, sehen Sie sich ein Video einer wandelnden Person wie YouTube über den Bildschirm Ihres iPhones an. Bitte sehen Sie.
Alle Quellen werden an Github weitergeleitet. Bitte nehmen Sie sie mit. https://github.com/Satoiosdevelop/ExampleMotionCapture