我正在尝试创造一些 AR 体验。
我将带有动画的模型加载为实体。我们称其为玩具。 我创建了一个AnchorEntity。 我将玩具附加到AnchorEntity。到目前为止,一切都很顺利。
我希望玩具朝随机方向行走。这还是第一次。然后它就变得有趣了,请允许我分享我的代码:
第一种方法使用为玩具新创建的变换,并修改翻译x、y,以让玩具移动,就是这样。
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。而玩具的翻译:
我没有任何想法,感谢任何帮助。如果需要,我可以分享整个代码。
最佳答案
我已经通过将参数 relativeTo 指定为玩具的 AnchorEntity 成功解决了该问题:
toy.move(to: newTransform, relativeTo: anchorEntity, duration: travelTime)
关于swift - iOS RealityKit。更改实体的翻译会导致意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69409102/