RealityKit'te hareketleri etkinleştirme

Oct 03 2020

Özel bir usdz dosyam var (kodla oluşturmuyorum, ancak gerçek bir sandalye diyelim!). Bunu bir Entity.

Elime geçtiğinde bu benim kodum:

func updateUIView(_ uiView: ARView, context: Context) {
            
    if let modelEntity = model.modelEntity {
        
        print("\(model.modelName)")
        
        let anchorEntity = AnchorEntity(plane: .horizontal)
        
        anchorEntity.addChild(modelEntity.clone(recursive: true))
        
        uiView.scene.addAnchor(anchorEntity)
        
        // modelEntity.generateCollisionShapes(recursive: true) 
        // If we have multiple object, recursive true help to generate collision for all of them
        
        uiView.installGestures(.rotation, for: modelEntity as! Entity & HasCollision)
        
        uiView.debugOptions = .showPhysics
        
    } else {
        
        print("Unable to load modelEntity for \(model.modelName)")
        
    }
}

Buradaki sorun, "Bağımsız değişken türü 'Varlık' beklenen tür 'HasCollision' ile uyumlu değildir". Bu yüzden herhangi bir jest ekleyemiyorum.

Ama nihai hedefime ulaşmak için yeterli kaynak bulamıyorum. Herhangi bir tavsiye var mı?

Yanıtlar

2 AndyFedoroff Oct 03 2020 at 23:25

(Tip döküm) downcasting zorunlu formu kullanarak as!ile Entity & HasCollision.

arView.installGestures([.rotation], for: modelEntity as! Entity & HasCollision)

veya bu şekilde:

let entity = modelEntity as? Entity & HasCollision
arView.installGestures([.all], for: entity!)


Bir kaynak örnek yöntemi installGestures(_:for:)şuna benzer:

@discardableResult func installGestures(_ gestures: ARView.EntityGestures = .all,
                           for entity: HasCollision) -> [EntityGestureRecognizer]


Reality Composer'da İlk Ayarlar

Gerçeklik Besteci setinde, derlemeden önce physics = participatesve motion type = fixedve accessibility = accessibility enabledmodeliniz için.

Tam kod sürümü

import SwiftUI
import RealityKit

struct ARViewContainer: UIViewRepresentable {
    
    let boxAnchor = try! Experience.loadBox()
    
    func makeUIView(context: Context) -> ARView {
        
        let arView = ARView(frame: .zero)   
        arView.scene.anchors.append(boxAnchor)
        return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context) {
        
        if let modelEntity: Entity = boxAnchor.steelBox {    
            let anchorEntity = AnchorEntity(.plane(.vertical, 
                                             classification: .wall, 
                                             minimumBounds: [0.2, 0.2]))  
            anchorEntity.addChild(modelEntity.clone(recursive: true))    
            uiView.scene.addAnchor(anchorEntity)    
            modelEntity.generateCollisionShapes(recursive: true)    
            uiView.installGestures([.all], 
                               for: modelEntity as! Entity & HasCollision)    
            uiView.debugOptions = [.showPhysics]
        }
    }
}
1 YanivH Oct 04 2020 at 17:30

Sorun, ModelEntity'ye sahip olmadığı bir yeteneği vermeye çalışmanızdır (Çarpışma işleyicisi yoktur).

HasCollision'a uygun bir Varlık yaratmanız gerekir.

Bunun gibi bir şey denerdim:

import RealityKit

class MyEntity: Entity, HasAnchoring, HasModel, HasCollision {

}

func updateUIView(_ uiView: ARView, context: Context) {
    // This is simply to create a dummy modelEntity
    let plane = MeshResource.generatePlane(width: 0.1, depth: 0.1)
    let texture = MaterialColorParameter.color(UIColor.red)
    var material = SimpleMaterial()
    material.baseColor = texture
    let modelEntity = ModelEntity(mesh: plane, materials: [material])
      
    // This is the class we have wrapping the model
    let myEntity = MyEntity()
    myEntity.addChild(modelEntity)
    
    // Now, we add the collision component
    let boxShape = ShapeResource.generateBox(width: 0.1, height: 0.1, depth: 0.1)
    let boxShapeCollisionComponent = CollisionComponent (
      shapes: [boxShape],
      mode: .trigger,
      filter: .default
    )
    myEntity.collision = boxShapeCollisionComponent
    // Or, you could of called myEntity.generateCollisionShapes(recursive: true)
    
    // Last thing, lets put this plane, with a box collision component,
    // right in front of us
    myEntity.transform = Transform.identity
    myEntity.transform.translation.z = myEntity.transform.translation.z - 0.3
    uiView.scene.addAnchor(myEntity)
    
    uiView.installGestures(.rotation, for: myEntity)
    
    uiView.debugOptions = .showPhysics
}
АлександрГрабовский Oct 30 2020 at 00:07

Başka bir durumla karşılaştım: Modeli .usdzdosyadan yüklemem gerekiyordu ve bir animasyonu olmalı. Ama aynı zamanda çeviri ve döndürme gibi jestlere de ihtiyacım vardı. Araştırma beni yönettiği iplik doğru cevabı olan. Altında göstereceğim kod, ana fikir "animasyonlara sahip olan yüklü varlığı bir ModelEntity'nin içine yerleştirmek ve sonra bu ModelEntity'ye yüklenen modelin sınırlarına göre uygun bir CollisionComponent vermektir." (c)

loadRequest = Entity.loadAsync(contentsOf: url).sink(receiveCompletion: { status in
            print(status)
        }) { entity in
           
            // Scaling entity to a reasonable size
            entity.setScale(SIMD3(repeating: 0.01), relativeTo: nil)
           
            // Creating parent ModelEntity
            let parentEntity = ModelEntity()
            parentEntity.addChild(entity)
           
            // Anchoring the entity and adding it to the scene
            let anchor = AnchorEntity(.plane(.horizontal, classification: .any, minimumBounds: .zero))
            anchor.addChild(parentEntity)
            self.arView.scene.addAnchor(anchor)
           
            // Playing availableAnimations on repeat
            entity.availableAnimations.forEach { entity.playAnimation($0.repeat()) }
           
            // Add a collision component to the parentEntity with a rough shape and appropriate offset for the model that it contains
            let entityBounds = entity.visualBounds(relativeTo: parentEntity)
            parentEntity.collision = CollisionComponent(shapes: [ShapeResource.generateBox(size: entityBounds.extents).offsetBy(translation: entityBounds.center)])
                       
            // installing gestures for the parentEntity
            self.arView.installGestures(for: parentEntity)
           
        }