swift - iOS RealityKit。更改实体的翻译会导致意外行为

标签 swift arkit realitykit

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

我将带有动画的模型加载为实体。我们称其为玩具。 我创建了一个AnchorEntity。 我将玩具附加到AnchorEntity。到目前为止,一切都很顺利。

我希望玩具朝随机方向行走。这还是第一次。然后它就变得有趣了,请允许我分享我的代码:

第一种方法使用为玩具新创建的变换,并修改翻译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()
        }
    }

我们通过下面的方法获得新的转换

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增长到某个随机值<1。总是在第二次walk()之后正在调用方法。

正如你所看到的,每次调用该方法时,newTranslation 都会将 Y 值设置为 0。而玩具的翻译: enter image description here

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

最佳答案

我已经通过将参数 relativeTo 指定为玩具的 AnchorEntity 成功解决了该问题:

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

关于swift - iOS RealityKit。更改实体的翻译会导致意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69409102/

相关文章:

swift - 如何在 3D 模型的折叠中打开阴影?

ios - 如何在 xCode 中访问 iphone 锁屏和主屏幕图像?

ios - Xcode 9.2 升级导致此错误 : "Command/bin/sh failed with exit code 1"

ios - AVCaptureSession预设照片和高度优化

swift - 如何访问从 Firebase 下载的 SceneKit 文件?

scenekit - 如何创建 .usdz 动画?

swift - ARKit – 使用 SCN 文件 > 300 MB 时获取 "Unexpectedly found nil"

swift - RealityKit – 什么是 `steelBox` 实例加载?

ios - 如何发送[字符串:Any] dictionary in multipart API?

ios - 有没有使用 iPhone X ARKit 创建人脸识别和检测应用程序的方法?