【问题标题】:iOS RealityKit. Changing Entity's translation causes unexpected behaviouriOS RealityKit。更改实体的翻译会导致意外行为
【发布时间】:2021-11-23 07:00:28
【问题描述】:

我正在尝试创造一些 AR 体验。

我将带有动画的 Model 加载为 Entity。让我们称它为玩具。 我创建了一个 AnchorEntity。 我将玩具连接到 AnchorEntity。到目前为止,一切都很好。

我想让 玩具 随意走动。这是第一次。然后它变得有趣,请允许我分享我的代码:

第一种方法为 Toy 使用新创建的 Transform,并带有修改后的翻译 xy,以让玩具动起来,就是这样。

func walk(completion: @escaping () -> Void) {
        guard let robot = robot else {
            return
        }
        let currentTransform = robot.transform
        guard let path = randomPath(from: currentTransform) else {
            return
        }
        let (newTranslation , travelTime) = path
        
        let newTransform = Transform(scale: currentTransform.scale,
                                     rotation: currentTransform.rotation,
                                     translation: newTranslation)
        
        robot.move(to: newTransform, relativeTo: nil, duration: travelTime)

        DispatchQueue.main.asyncAfter(deadline: .now() + travelTime + 1) {
            completion()
        }
    }

我们通过下面的方法得到了新的Transform

func randomPath(from currentTransform: Transform) -> (SIMD3<Float>, TimeInterval)? {
        // Get the robot's current transform and translation
        let robotTranslation = currentTransform.translation
        
        // Generate random distances for a model to cross, relative to origin
        let randomXTranslation = Float.random(in: 0.1...0.4) * [-1.0,1.0].randomElement()!
        let randomZTranslation = Float.random(in: 0.1...0.4) * [-1.0,1.0].randomElement()!
        
        // Create a translation relative to the current transform
        let relativeXTranslation = robotTranslation.x + randomXTranslation
        let relativeZTranslation = robotTranslation.z + randomZTranslation
        
        // Find a path
        var path = (randomXTranslation * randomXTranslation + randomZTranslation * randomZTranslation).squareRoot()
        
        // Path only positive
        if path < 0 { path = -path }
        
        // Calculate the time of walking based on the distance and default speed
        let timeOfWalking: Float = path / settings.robotSpeed

        // Based on old trasnlation calculate the new one
        let newTranslation: SIMD3<Float> = [relativeXTranslation,
                                            Float(0),
                                            relativeZTranslation]
        
        return (newTranslation, TimeInterval(timeOfWalking))
    }

问题是 Entity.transform.translation.y 的值从 0 增长到某个随机值 walk() 之后方法正在被调用。

如您所见,每次调用该方法时,newTranslation 都会将 Y 值设置为 0。而玩具的翻译:

我没有任何想法,感谢您的帮助。如果需要,我可以分享整个代码。

【问题讨论】:

    标签: swift arkit realitykit


    【解决方案1】:

    我已通过将参数 relativeTo 指定为 Toy 的 AnchorEntity 来解决此问题:

    toy.move(to: newTransform, relativeTo: anchorEntity, duration: travelTime)
    

    【讨论】:

      猜你喜欢
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      相关资源
      最近更新 更多