MagnifyGesture 在 SwiftUI 的 RealityView 中不起作用

问题描述 投票:0回答:1

我正在尝试在 SwiftUI 中实现放大手势

RealityView
。我的目标是允许用户通过捏合来放大 RealityKit 场景。然而,
MagnifyGesture
似乎没有任何效果。以下是我当前的实现:

import SwiftUI
import RealityKit

struct ContentView: View {
    @State private var scale: Float = 1.0
    @GestureState private var magnifyBy = 1.0

    var magnification: some Gesture {
        MagnifyGesture()
            .targetedToAnyEntity()
            .updating($magnifyBy) { value, gestureState, transaction in
                gestureState = value.magnification
            }
    }

    var body: some View {
        VStack {
            RealityView { content in
                // Load and Add Your RealityKit Scene (Without Anchor)
                if let sceneEntity = try? await Entity(named: "Scene", in: realityKitContentBundle) {
                    content.add(sceneEntity) // Directly add to content
                }
                
                // Add the initial RealityKit content
                let dataPoints = loadData()
                for dataPoint in dataPoints {
                    let sphere = createSphereEntity()
                    sphere.position = SIMD3(dataPoint.x, dataPoint.y, dataPoint.z)
                    content.add(sphere)
                }
            }
            .gesture(magnification)
            .scaleEffect(magnifyBy)

            // Display the current scale
            Text("Current Scale: \(magnifyBy, specifier: "%.2f")")
                .padding()
        }
    }

    func loadData() -> [SIMD3<Float>] {
        // Example function to load data points
        return [SIMD3(0, 0, 0), SIMD3(1, 1, 1)]
    }

    func createSphereEntity() -> Entity {
        // Example function to create a sphere entity
        return Entity()
    }
}

问题:

  1. MagnifyGesture
    似乎并不影响
    RealityView
    的规模。
  2. scaleEffect(magnifyBy)
    修改器无法正确应用放大倍率。

问题:

如何让

MagnifyGesture
在 SwiftUI 中的
RealityView
中正常工作?将手势应用于
RealityView
内容是否需要任何具体注意事项或额外步骤?


任何帮助或指导将不胜感激!

您尝试了什么以及您期待什么?

我希望

MagnifyGesture
能够让用户通过捏合来放大
RealityView
内容。我试过了:

  1. 确保
    RealityView
    及其内容正确设置并正确渲染。
  2. 将手势应用到 2D SwiftUI 元素(如
    Circle()
    ),可以正常工作。

但是,放大倍数不会影响

RealityView
。当手势应用于
magnifyBy
时,
RealityView
状态不会改变,但当应用于
Circle()
等 2D SwiftUI 元素时,它会按预期工作。

swiftui realitykit visionos
1个回答
0
投票

使用 MagnifyGesture 缩放 3D 模型

目前看来,

MagnifyGesture()
无法像visionOS中的
拖动
旋转等其他SwiftUI手势一样正确地用于scaling RealityKit场景。如果你想使用
MagnifyGesture()
来放大/缩小模型,现在有点棘手。请注意,我使用了 Reality Composer Pro 中的 70 厘米半径的球体,它具有 InputTarget 组件和碰撞形状(与球体大小相同)。

enter image description here

这是我的代码:

import SwiftUI
import RealityKit
import RealityKitContent

struct ContentView : View {
    @State var intermediateScale = 0.0
    @State var scale = 1.0

    var magnification: some Gesture {
        MagnifyGesture()
            .targetedToAnyEntity()
            .onChanged {
                intermediateScale = $0.magnification - 1.0
                scale += intermediateScale
                intermediateScale = 0.0
            }
    } 
    var body: some View {
        RealityView { rvc, attachments in
            // rkcb is realityKitContentBundle
            if let model = try? await Entity(named: "Scene", in: rkcb),
               let text = attachments.entity(for: "attached") {
                model.position = [0, 1,-5]
                rvc.add(model)
                
                text.position = model.position
                text.position.y = model.position.y - 1.5
                rvc.add(text)
            }
        } update: { (rvc, _) in
            if let model = rvc.entities.first {                  
                let factor = Float(scale)
                model.scale = [factor, factor, factor]
            }
        } attachments: {
            Attachment(id: "attached") {
                Text("Scale: \(scale, specifier: "%.2f")")
                    .font(.system(size: 200))
            }
        }
        .gesture(magnification)
        .accessibilityZoomAction {
            if $0.direction == .zoomIn {
                scale += 0.01
            } else if $0.direction == .zoomOut {
                scale -= 0.01
            }
        }
    }
}

@main struct ScalingApp : App {
    var body: some Scene {
        ImmersiveSpace() {
            ContentView()
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.