Независимое вращение нескольких объектов в RealityView

С помощью RealityView объект можно повернуть с помощью детектора жестов на весь вид:

      RealityView { content in
    let loadedEntity = try await ModelEntity(named: modelName, 
                       in: RealityKitContent.realityKitContentBundle)
    // Add components to entity
    loadedEntity.generateCollisionShapes(recursive: true)
    loadedEntity.components.set(InputTargetComponent())

    loadedEntity.setParent(anchor)

    // Add the anchor which is the parent of the entity
    content.add(anchor)
  } .gesture(
      drag
  )

Вопрос

Это работает для одной модели, но что, если в RealityView есть две модели и каждая модель должна иметь разное вращение? Как добавить жест к каждой модели отдельно? Используете Model3D?

Сюда не следует включать построение сцены в RealityComposerPro. Мы говорим о программном создании объектов и разрешении жестов.

Оригинальный пост о выяснении ротации здесь

1 ответ

Независимое вращение объектов в RealityView

Я создал два куба в сцене Reality Composer Pro. И разместил их на расстоянии50 cmдруг от друга. Если вам не нужно строить сцену в Reality Composer Pro с нуля, просто добавьте два примитива программно или добавьте две модели USDZ с помощьюtry? await Entity(named: String).

я реализовал.gesture()модификатор и.targetedToEntity()модификатор для каждой модели.

      import SwiftUI
import RealityKit
import RealityKitContent

      struct ContentView: View {    
    @State var rotationA: Angle = .zero
    @State var rotationB: Angle = .zero
    @State var cubeA = Entity()
    @State var cubeB = Entity()
    
    var body: some View {            
        RealityView { content in
            if let scene = try? await Entity(named: "Scene", 
                                                in: realityKitContentBundle) {
                content.add(scene)
                print(scene)
            }
        } update: { content in
            if let scene = content.entities.first {
                Task {
                    cubeA = scene.findEntity(named: "Cube_A") ?? Entity()
                    cubeA.components.set(InputTargetComponent())
                    cubeA.generateCollisionShapes(recursive: false)

                    cubeB = scene.findEntity(named: "Cube_B") ?? Entity()
                    cubeB.components.set(InputTargetComponent())
                    cubeB.generateCollisionShapes(recursive: false)
                }
            }
        }
        .gesture(
            DragGesture()
                .targetedToEntity(cubeA)
                .onChanged { _ in
                    rotationA.degrees += 5.0
                    let m1 = Transform(pitch: Float(rotationA.radians)).matrix
                    let m2 = Transform(yaw: Float(rotationA.radians)).matrix
                    cubeA.transform.matrix = matrix_multiply(m1, m2)
                    // Keep starting distance between models
                    cubeA.position.x = -0.25
                }
        )
        .gesture(
            DragGesture()
                .targetedToEntity(cubeB)
                .onChanged { _ in
                    rotationB.degrees += 5.0
                    cubeB.transform = Transform(roll: Float(rotationB.radians))
                    // Keep starting distance between models
                    cubeB.position.x = 0.25
                }
        )
    }
}

Иерархия сцен выглядит следующим образом:

Другие вопросы по тегам