Problem mit Gestensteuerung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit Gestensteuerung

    Hi Zusammen,
    ich habe ein Problem mit der Gestensteuerung in Xcode/Swift.
    Ich habe eine ganz einfache AR-Datei in RealityComposer erstellt und als rcproject (der Name der Datei ist TestSpiral) in xcode eingebunden. Wenn ich mir meine Programmierung auf dem iPhone anschaue, so sehe ich das 3d Model auf meinem Schreibtisch. Ich kann mich auch drumherum bewegen. Somit ist alles ok. Aber nun möchte ich das 3d-Objekt gerne auf der Schreibtischplatte mit zwei Fingern um die senkrechte Achse drehen können. Aber irgendwas mache ich etwas falsch in meiner Programmierung. Kann mir jemand helfen?
    Leider kann ich das Projekt nicht hochladen, da es zu groß ist. Daher hoffe ich, dass vielleicht schon im Code mein Fehler zu sehen ist.

    Ich benutze xcode 12.4.

    Vielen Dank für eure Hilfe.

    Code:

    Quellcode

    1. import UIKit
    2. import RealityKit
    3. import ARKit
    4. import SceneKit
    5. class ViewController: UIViewController {
    6. @IBOutlet var gestureRecognizer: UIRotationGestureRecognizer!
    7. // DECLARE VARIABLE MODELANCHOR
    8. var modelAnchor: TestSpiral.MainScene?
    9. // ALLOW INTERACTION
    10. var isUserInteractionEnabled = Bool (true)
    11. // DECLARE VARIABLE ARVIEW
    12. @IBOutlet weak var sceneView: ARView!
    13. override func viewDidLoad() {
    14. super.viewDidLoad()
    15. // GESTURE ROTATION
    16. func rotatePiece(_ gestureRecognizer: UIRotationGestureRecognizer) {
    17. guard gestureRecognizer.view != nil else {return}
    18. if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
    19. gestureRecognizer.view?.transform = gestureRecognizer.view!.transform.rotated(by: gestureRecognizer.rotation)
    20. gestureRecognizer.rotation = 0
    21. }}
    22. // LOAD MODELL
    23. modelAnchor = try! TestSpiral.loadMainScene()
    24. sceneView.scene.anchors.append(modelAnchor!)
    25. }
    26. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ovidus ()

  • Mich irritiert schon die Definition der Funktion rotatePiece innerhalb der Funktion viewDidLoad. Mir war nicht bewusst, dass dies in Swift überhaupt funktioniert. ?(

    Warum definierst Du diese innerhalb von viewDidLoad und welche Vorteile bringt dies?

    Poste auch mal den Crash Log. Darin sollte es Hinweise geben, warum die App abbricht.
  • Hi MCDan,

    ich bin relativ neu in Xcode und versuche mir mit verschiedenen Tutorials und Büchern die Grundlagen des Tools beizubringen. Aber ich bin halt Designer/3d-Artist und kein Programmierer. Daher stochere ich etwas im Nebel. Ich hatte diesen Code gefunden und dachte, dass man denn für meine Zwecke optimieren könnte. Aber ich habe inzwischen selber festgestellt, dass der code irgendwie fehlerhaft ist.
    Ich habe mir eigentlich eine relativ einfach klingende Aufgabe gestellt. Ich möchte ein 3d Objekt aus meiner Animationssoftware über RealityConverter und RealityComposer in Xcode bringen. Das habe ich auch geschafft. Im RealityComposer habe ich dem Objekt verschiedene Verhaltensweisen/Bewegungen gegeben, die ich in Xcode über notifications ansteuern kann. Nun möchte ich, dass das 3d Objekt durch Gestensteuerung verschoben, gedreht, skaliert werden kann. Zum Ausprobieren habe ich mir verschiedene Tutorials angeschaut. Aber das was ich suche ist nicht zu finden.
    Ich habe mir jetzt zum Testen ein ganz einfaches Tutorial angeschaut und nachgebaut. In dem Tutorial wird eine usdz Datei in Xcode importiert und dann die Gestensteuerung erstellt. Das funktioniert auch sehr gut. Aber ich brauche genau das Gleiche nur mit einer rcproject-Datei anstatt usdz. Die rcproject-Datei kommt aus dem RealityComposer und kann, wie gesagt, durch notifications in Xcode angesteuert werden. Daher benötige ich dieses Dateiformat. Was muss ich an dem Code ändern, damit es mit der rcproject-Datei funktioniert.

    Wie du siehst, wird in dem Code die usdz Datei (cup_saucer_set.usdz) (Beispiel von der Apple Beispielseite) angesprochen. Ich möchte aber die TestSpiral.rcproject ansprechen (im Anhang).

    Und noch eine Frage: Ich mache das alles nicht zu Vergnügen, sondern für das Unternehmen in dem ich Tätig bin. Wir sind auf der Suche nach einem Freelancer, der uns bei komplexeren AR-Anwendungen unter die Arme greifen kann. Es geht besonders um die Verknüpfung von AR-Inhalten mit Menüsteuerung, also Konfiguratoren mir AR.

    Quellcode

    1. import UIKit
    2. import RealityKit
    3. import ARKit
    4. class ViewController: UIViewController {
    5. @IBOutlet var arView: ARView!
    6. //var modelAnchor: TestSpiral.MainScene?
    7. override func viewWillAppear(_ animated: Bool) {
    8. super.viewWillAppear(true)
    9. arView.session.delegate = self
    10. setUpCustomObjectView()
    11. let tapGesture = UITapGestureRecognizer(target: self, action: #selector(onTap))
    12. arView.addGestureRecognizer(tapGesture)
    13. }
    14. func setUpCustomObjectView () {
    15. arView.automaticallyConfigureSession = false
    16. let configuration = ARWorldTrackingConfiguration()
    17. configuration.planeDetection = [.horizontal, .vertical]
    18. configuration.environmentTexturing = .automatic
    19. arView.session.run(configuration)
    20. }
    21. @IBAction func onTap(recognizer: UITapGestureRecognizer) {
    22. let location = recognizer.location(in: arView)
    23. let result = arView.raycast(from: location, allowing: .estimatedPlane, alignment: .horizontal)
    24. if let firstResult = result.first {
    25. let anchor = ARAnchor(name: "cup_saucer_set.usdz", transform: firstResult.worldTransform)
    26. arView.session.add(anchor: anchor)
    27. } else {
    28. print("Object placement failed")
    29. }
    30. }
    31. func placeObject(named entityName: String, for anchor: ARAnchor){
    32. let entity = try! ModelEntity.loadModel(named: entityName)
    33. entity.generateCollisionShapes(recursive: true)
    34. arView.installGestures([.rotation, .translation, .scale], for: entity)
    35. let anchorEntity = AnchorEntity(anchor: anchor)
    36. anchorEntity.addChild(entity)
    37. arView.scene.addAnchor(anchorEntity)
    38. }
    39. }
    40. extension ViewController: ARSessionDelegate {
    41. func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
    42. for anchor in anchors {
    43. if let anchorObject = anchor.name, anchorObject == "cup_saucer_set.usdz" {
    44. placeObject(named: anchorObject, for: anchor)
    45. }
    46. }
    47. }
    48. }
    Alles anzeigen
    Dateien