我正在尝试在 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()
}
}
MagnifyGesture
似乎并不影响RealityView
的规模。scaleEffect(magnifyBy)
修改器无法正确应用放大倍率。如何让
MagnifyGesture
在 SwiftUI 中的 RealityView
中正常工作?将手势应用于 RealityView
内容是否需要任何具体注意事项或额外步骤?
任何帮助或指导将不胜感激!
我希望
MagnifyGesture
能够让用户通过捏合来放大 RealityView
内容。我试过了:
RealityView
及其内容正确设置并正确渲染。Circle()
),可以正常工作。但是,放大倍数不会影响
RealityView
。当手势应用于 magnifyBy
时,RealityView
状态不会改变,但当应用于 Circle()
等 2D SwiftUI 元素时,它会按预期工作。
目前看来,
MagnifyGesture()
无法像visionOS中的拖动和旋转等其他SwiftUI手势一样正确地用于
scaling
RealityKit场景。如果你想使用 MagnifyGesture()
来放大/缩小模型,现在有点棘手。请注意,我使用了 Reality Composer Pro 中的 70 厘米半径的球体,它具有 InputTarget 组件和碰撞形状(与球体大小相同)。
这是我的代码:
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()
}
}
}