【发布时间】:2021-11-23 07:00:28
【问题描述】:
我正在尝试创造一些 AR 体验。
我将带有动画的 Model 加载为 Entity。让我们称它为玩具。 我创建了一个 AnchorEntity。 我将玩具连接到 AnchorEntity。到目前为止,一切都很好。
我想让 玩具 随意走动。这是第一次。然后它变得有趣,请允许我分享我的代码:
第一种方法为 Toy 使用新创建的 Transform,并带有修改后的翻译 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()
}
}
我们通过下面的方法得到了新的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