#swift #arkit #realitykit
Вопрос:
Я пытаюсь создать некоторый опыт AR.
Я загружаю модель с анимацией как сущность. Давайте назовем это Игрушкой. Я создаю привязку. Я прикрепляю Игрушку к якорю. До этого момента все работало отлично.
Я хочу, чтобы Игрушка двигалась в случайных направлениях. И это происходит в первый раз. Тогда становится интересно, позвольте мне поделиться своим кодом:
Первый метод использует недавно созданное преобразование для Игрушки с измененным переводом 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. И все же перевод игрушки:
У меня нет идей, любая помощь будет оценена по достоинству. Я могу поделиться всем кодом, если это необходимо.
Ответ №1:
Мне удалось устранить проблему, указав параметр relativeTo в качестве привязки игрушки:
toy.move(to: newTransform, relativeTo: anchorEntity, duration: travelTime)