Изменение поля зрения в iOS ARkitIOS

Программируем под IOS
Ответить
Anonymous
 Изменение поля зрения в iOS ARkit

Сообщение Anonymous »

В iPad Pro (M4) последнего поколения компания Apple заменила фронтальную камеру на сверхширокую (0,5-кратное увеличение, как у iPhone), а не на «обычную» камеру. Кажется, что все приложения Apple обрезают изображение с камеры до старого угла обзора, и эту обрезанную область можно настроить на лету, чтобы она всегда следовала за вами и всегда была в камере, если вы перемещаетесь во время видеовызова (= центральная сцена).
Теперь, к сожалению, с конфигурацией ARFaceTrackingConfiguration по умолчанию вы получаете полный широкоугольный снимок камеры, что не идеально подходит для отслеживания лица (вам придется поднести устройство намного ближе к лицу, чтобы получить изображение, похожее на на старых моделях).
Как обрезать поле зрения сеанса AR? Я попытался установить свойство FieldOfView объекта камеры ScienView, но это не дало никакого эффекта.
Вот минимальный пример:

Код: Выделить всё

import SwiftUI
import ARKit

struct FaceTrackingView1: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> FaceTrackingViewController1 {
return FaceTrackingViewController1()
}

func updateUIViewController(_ uiViewController: FaceTrackingViewController1, context: Context) {
}
}

class FaceTrackingViewController1: UIViewController, ARSCNViewDelegate, ARSessionDelegate {
var sceneView: ARSCNView!

override func viewDidLoad() {
super.viewDidLoad()

sceneView = ARSCNView(frame: view.bounds)
sceneView.delegate = self
sceneView.automaticallyUpdatesLighting = true
view.addSubview(sceneView)

let config = ARFaceTrackingConfiguration()
sceneView.session.run(config)
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
sceneView.session.pause()
}

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
guard anchor is ARFaceAnchor else { return nil }

let faceGeometry = ARSCNFaceGeometry(device: sceneView.device!)!
let faceNode = SCNNode(geometry: faceGeometry)
faceNode.geometry?.firstMaterial?.fillMode = .lines // Makes it a wireframe mesh

return faceNode
}

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
guard let faceAnchor = anchor as? ARFaceAnchor,
let faceGeometry = node.geometry as? ARSCNFaceGeometry else { return }

faceGeometry.update(from: faceAnchor.geometry)
}
}
И представление содержимого:

Код: Выделить всё

import SwiftUI

struct ContentView: View {
@State private var isFaceTrackingActive = false

var body: some View {
VStack {
Text("Face mesh tracking demo")
.font(.title)
.padding()

// Button directly on the main screen
Button(action: {
isFaceTrackingActive.toggle()
}) {
Text("Start Face Tracking")
.font(.title2)
}
.fullScreenCover(isPresented: $isFaceTrackingActive) {
FaceTrackingView1()
}
}
.padding()
}
}

#Preview {
ContentView()
}
Чтобы внести ясность, я не хочу получить функцию Center Stage, которая автоматически отслеживает пользователя, мне просто нужен фиксированный обрезанный угол обзора, сравнимый со старыми iPad.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -ios-arkit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»